Objek
Los objetos en Quetzal permiten agrupar datos y comportamientos. Se definen con la palabra clave objeto seguida del nombre y un bloque de miembros.
Declaracion basica
Sección titulada «Declaracion basica»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
privadoopublicoson publicos por defecto. - Los constructores usan el mismo nombre del objeto y no retornan valor explicito.
Instanciacion
Sección titulada «Instanciacion»Usuario persona = nuevo Usuario("Maria", 30)texto nombre = persona.obtener_nombre()Bloques privado y publico
Sección titulada «Bloques privado y publico»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
privadosolo estan disponibles dentro del objeto. - Los miembros en
publicopueden usarse desde cualquier parte.
Miembros libres
Sección titulada «Miembros libres»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)Mutabilidad de atributos
Sección titulada «Mutabilidad de atributos»- Los atributos son inmutables a menos que se declaren con
vardentro del objeto. - Para modificar desde metodos publicos usa
ambiente.
objeto Contador { entero var valor = 0
vacio incrementar() { ambiente.valor++ }}Herencia
Sección titulada «Herencia»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.
Herencia simple
Sección titulada «Herencia simple»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!" }}Uso del objeto heredado
Sección titulada «Uso del objeto heredado»// Instanciar el objeto hijoPerro perro1 = nuevo Perro("Firulais", "Canino")
// Acceder a metodos propiostexto sonido = perro1.ladrar() // "Guau!"
// Acceder a metodos heredados del padretexto nombre = perro1.obtener_nombre() // "Firulais"texto especie = perro1.obtener_especie() // "Canino"Herencia en cascada
Sección titulada «Herencia en cascada»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:
Gatohereda deMamiferoMamiferohereda deAnimalGatotiene acceso a metodos deMamiferoyAnimal
Gato gato1 = nuevo Gato("Michi", "Felino")texto nombre = gato1.obtener_nombre() // Heredado de Animaltexto sonido = gato1.maullar() // Propio de GatoHerencia multiple
Sección titulada «Herencia multiple»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!" }}Sobrescribir metodos
Sección titulada «Sobrescribir metodos»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"Acceder a metodos del padre
Sección titulada «Acceder a metodos del padre»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" }}Exportar objetos
Sección titulada «Exportar objetos»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.