Clases y Objetos
Programación orientada a objetos
La programación orientada a objetos (POO) es un paradigma de programación que se enfoca en el uso de "objetos" como unidades básicas de programación. Un objeto es una instancia de una clase, que es una plantilla o molde para crear objetos.
Un objeto tiene dos partes principales: propiedades (también conocidos como variables de instancia) y métodos (también conocidos como funciones de instancia). Las propiedades representan las características de un objeto, mientras que los métodos representan las acciones que un objeto puede realizar.
La POO se basa en tres principios fundamentales: encapsulamiento, herencia y polimorfismo. El encapsulamiento se refiere a la ocultación de los detalles de implementación de un objeto, permitiendo que los objetos interactúen entre sí a través de una interfaz pública. La herencia permite que una clase herede las características y comportamientos de otra clase, mientras que el polimorfismo permite que un objeto tome diferentes formas dependiendo del contexto.
En JARU, se pueden crear clases utilizando la palabra clave class seguida del nombre de la clase. Dentro de la clase, se pueden definir propiedades (variables) y métodos (funciones) que son específicos para esa clase.
Declaración de clases
En JARU, las clases son una herramienta fundamental para la programación orientada a objetos. Una clase es un molde o plantilla para crear objetos que comparten características y comportamientos específicos.
La declaración de una clase en JARU se inicia con la palabra clave class seguida del nombre de la clase:
class Persona
// propiedades y metodos van aqui
end
En este caso, acabamos de crear una clase llamada "Persona". Dentro de esta clase podemos declarar propiedades y métodos.
Declaración de propiedades
En JARU, las propiedades son valores asociados a una instancia de una clase. Estas propiedades pueden ser creadas en tiempo de ejecución y pueden ser accedidas y modificadas tanto desde dentro de la clase (utilizando la palabra clave this) como desde fuera de la clase con la sintaxis miClase.propiedad.
La palabra clave this en JARU se refiere a la instancia actual de un objeto en una clase. Se utiliza para acceder a las propiedades y métodos de la clase desde dentro de la misma.
La declaración de propiedades en JARU se realiza de manera dinámica, es decir, no es necesario declararlas previamente en la clase. El método init es una forma común de inicializar las propiedades al momento de crear una nueva instancia de una clase.
class Persona
def init(nombre)
this.nombre = nombre
end
end
var p1 = Persona("Juan")
var p2 = Persona("Maria")
print(p1.nombre) // muestra "Juan"
print(p2.nombre) // muestra "Maria"
Las propiedades también pueden ser creadas y modificadas desde fuera de la clase:
class Persona
def init()
end
end
var juan = Persona()
juan.alias = "Krilin" // Crea la propiedad "alias" en el objeto "juan"
print(juan.alias)
Las propiedades son asociadas a una instancia de un objeto, no a la clase en sí. Esto quiere decir que cada vez que se crea una nueva instancia de una clase, se crea una copia independiente de sus propiedades asociada a la instancia.
Declaración de métodos
Los métodos son funciones que se definen dentro de una clase y tienen acceso a las propiedades de la misma. La sintaxis para declarar un método en JARU es la palabra clave def seguida del nombre del método, los parámetros entre paréntesis, y debe finalizar con end.
class Persona
def saludar()
print("Hola!")
end
end
Los métodos también pueden tener parámetros y retornar valores:
class Calculadora
def sumar(a, b)
return a + b
end
end
Los métodos pueden acceder a las propiedades de una clase usando this:
class Persona
def init()
this.nombre = ""
end
def saludar()
print("Hola! " + this.nombre)
end
end
Constructores
El constructor es un método especial llamado init() que se utiliza para inicializar un objeto de una clase al momento de su creación:
class NombreDeLaClase
def init()
// código de inicialización
end
end
El constructor se llama automáticamente cuando se crea un nuevo objeto de una clase. El nombre del constructor siempre debe ser init y debe estar dentro de la definición de la clase.
class Persona
def init()
this.nombre = "Sin nombre"
this.edad = 0
end
end
También es posible pasar parámetros al constructor:
class Persona
def init(nombre, edad)
this.nombre = nombre
this.edad = edad
end
end
Sobrecarga de Constructores
En JARU se permite la sobrecarga del método constructor init, que se refiere a la capacidad de tener varias versiones de este método con diferentes argumentos:
class Persona
def init(nombre, edad)
this.nombre = nombre
this.edad = edad
end
def init(nombre)
this.nombre = nombre
this.edad = 0
end
end
var p1 = Persona("Juan", 25)
var p2 = Persona("Maria")
La sobrecarga del método init es una técnica muy útil para crear objetos de diferentes formas y adaptarse a las necesidades específicas del programa.
Herencia de clases
La herencia en programación orientada a objetos es un mecanismo que permite a una clase (llamada clase hija o subclase) heredar las propiedades y métodos de otra clase (llamada clase padre o superclase).
En JARU, el concepto de herencia se implementa mediante el uso de los dos puntos ::
class Padre
def init()
propiedad1 = "Valor"
end
def metodo1()
print("Hola, soy el método 1 del padre")
end
end
class Hijo : Padre
def metodo2()
print("Hola, soy el método 2 del hijo")
end
end
En este ejemplo, la clase Hijo hereda de la clase Padre, por lo que tiene acceso a la propiedad "propiedad1" y al método "metodo1", y puede también tener sus propias propiedades y métodos.
Encapsulamiento
El encapsulamiento es un principio fundamental de la programación orientada a objetos que se refiere a la ocultación de detalles de implementación de una clase. En JARU, el modificador de acceso private se utiliza para declarar propiedades y métodos que solo pueden ser accedidos desde dentro de la clase.
class Persona
private edad
def init(edad)
this.edad = edad
end
end
var p = Persona(25)
print(p.edad) // Error, la propiedad edad es privada
En JARU no existe la cláusula protected, pero sí se puede acceder a las propiedades y métodos privados desde una clase hija mediante la herencia.
Polimorfismo
El polimorfismo es uno de los pilares de la programación orientada a objetos que permite que un objeto de una clase pueda ser tratado como si fuera de otra clase relacionada. Esto significa que una misma acción puede tener distintos comportamientos en diferentes objetos, dependiendo de su clase.
Por ejemplo, imagine que tiene una clase llamada "Animal" y dos subclases "Gato" y "Perro". La clase "Animal" tiene un método llamado "hacerRuido" que se sobreescribe en las subclases "Gato" y "Perro" para emitir un sonido diferente. Cuando se crean objetos de cada subclase y se les llama a hacerRuido, cada objeto emite un sonido distinto, pero aún así pueden ser tratados como si fueran objetos de la clase "Animal".
El polimorfismo permite que se utilice una misma acción o método con distintos objetos, y dependiendo de su clase, se realice una acción diferente.