コンテンツにスキップ

オブジェクト

Los objetos en Quetzal permiten agrupar datos y comportamientos. Se definen con la palabra clave objeto seguida del nombre y un bloque de miembros.

objeto Usuario {
texto nombre
entero edad
Usuario(texto nombre, entero edad) {
ambiente.nombre = nombre
ambiente.edad = edad
}
texto obtener_nombre() {
retornar ambiente.nombre
}
}
  • Los atributos declarados fuera de privado o publico son publicos por defecto.
  • Los constructores usan el mismo nombre del objeto y no retornan valor explicito.
Usuario persona = nuevo Usuario("Maria", 30)
texto nombre = persona.obtener_nombre()
objeto Banco {
privado:
numero var saldo = 0
numero obtener_saldo_privado() {
retornar ambiente.saldo
}
publico:
Banco(numero inicial) {
ambiente.saldo = inicial
}
numero obtener_saldo() {
retornar ambiente.obtener_saldo_privado()
}
}
  • Los miembros dentro de privado solo estan disponibles dentro del objeto.
  • Los miembros en publico pueden usarse desde cualquier parte.

Los miembros declarados con la palabra libre actuan como miembros estaticos: pueden invocarse sin crear una instancia y no acceden al estado del objeto instanciado.

objeto MatematicaBasica {
libre numero PI = 3.14159
libre numero sumar(numero a, numero b) {
retornar a + b
}
}
numero resultado = MatematicaBasica.sumar(2, 3)
  • Los atributos son inmutables a menos que se declaren con var dentro del objeto.
  • Para modificar desde metodos publicos usa ambiente.
objeto Contador {
entero var valor = 0
vacio incrementar() {
ambiente.valor++
}
}

Quetzal soporta herencia de objetos mediante la palabra clave como. Esto permite crear jerarquias de objetos donde los hijos heredan atributos y metodos de los padres.

Para heredar de un objeto padre, usa como seguido del nombre del objeto padre:

objeto Animal {
privado:
texto var nombre
texto var especie
publico:
Animal(texto nombre, texto especie) {
ambiente.nombre = nombre
ambiente.especie = especie
}
texto obtener_nombre() {
retornar ambiente.nombre
}
texto obtener_especie() {
retornar ambiente.especie
}
vacio comer() {
consola.mostrar("El animal come.")
}
}
objeto Perro como Animal {
publico:
Perro(texto nombre, texto especie) {
padre.Animal(nombre, especie)
}
texto ladrar() {
retornar "Guau!"
}
}
// Instanciar el objeto hijo
Perro perro1 = nuevo Perro("Firulais", "Canino")
// Acceder a metodos propios
texto sonido = perro1.ladrar() // "Guau!"
// Acceder a metodos heredados del padre
texto nombre = perro1.obtener_nombre() // "Firulais"
texto especie = perro1.obtener_especie() // "Canino"

Puedes crear cadenas de herencia donde un objeto hereda de otro que a su vez hereda de un tercero:

objeto Mamifero como Animal {
publico:
Mamifero(texto nombre, texto especie) {
padre.Animal(nombre, especie)
}
texto comer() {
retornar "El mamifero come."
}
}
objeto Gato como Mamifero {
publico:
Gato(texto nombre, texto especie) {
padre.Mamifero(nombre, especie)
}
texto maullar() {
retornar "Miau!"
}
}

En este ejemplo:

  • Gato hereda de Mamifero
  • Mamifero hereda de Animal
  • Gato tiene acceso a metodos de Mamifero y Animal
Gato gato1 = nuevo Gato("Michi", "Felino")
texto nombre = gato1.obtener_nombre() // Heredado de Animal
texto sonido = gato1.maullar() // Propio de Gato

Quetzal permite heredar de multiples objetos padre separandolos con comas:

objeto Felino como Mamifero, Animal {
publico:
Felino(texto nombre, texto especie) {
padre.Mamifero(nombre, especie)
padre.Animal(nombre, especie)
}
texto comer() {
retornar padre.Mamifero.comer()
}
texto rugir() {
retornar "Rugido!"
}
}

Puedes sobrescribir metodos del padre definiendo un metodo con el mismo nombre en el hijo:

objeto Animal {
publico:
texto describir() {
retornar "Soy un animal"
}
}
objeto Perro como Animal {
publico:
Perro() {
padre.Animal()
}
// Sobrescribe el metodo del padre
texto describir() {
retornar "Soy un perro"
}
}
Perro perro = nuevo Perro()
consola.mostrar(perro.describir()) // "Soy un perro"

Desde un metodo sobrescrito, puedes llamar al metodo original del padre:

objeto Gato como Animal {
publico:
Gato() {
padre.Animal()
}
texto describir() {
texto descripcion_base = padre.Animal.describir()
retornar descripcion_base + ", especificamente un gato"
}
}

Los objetos pueden exportarse desde un modulo y reutilizarse en otros archivos.

exportar {
Usuario,
Banco,
Animal,
Perro
}

Consulta las secciones de constructores y modificadores de acceso para profundizar en cada caracteristica.