El constructor :new()
Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 8 de 70.
Crear objetos manualmente, hacer una tabla vacía, establecer su metatabla y vincular __index se vuelve repetitivo. La solución estándar es definir directamente en la clase un método constructor :new() que se encargue de todo esto por ti.
Este es el patrón:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
endDesglosemos lo que sucede dentro de :new(). Primero, creamos una tabla vacía llamada instance. Después, establecemos su metatabla en self, que es Dog cuando llamamos a Dog:new().
Como Dog.__index apunta al propio Dog, la instancia puede encontrar todos los métodos definidos en Dog. Finalmente, devolvemos el nuevo objeto.
Observa la línea Dog.__index = Dog fuera del constructor. Este es un atajo común: en lugar de crear una metatabla separada, la tabla de la clase sirve tanto como prototipo como metatabla.
Ahora crear objetos es limpio y coherente:
local myDog = Dog:new()
myDog:bark() -- Salida: Woof!Cada clase que crees seguirá esta misma estructura. El constructor :new() se convierte en el único lugar donde se crean los objetos, lo que hace que tu código esté organizado y sea predecible.
Desafío
FácilConstruyamos una clase Cat usando el patrón de constructor estándar que acabas de aprender. Organizarás tu código en dos archivos para practicar una estructura de módulos adecuada.
Crearás:
Cat.lua: Define tu claseCatcon el patrón de constructor completo. Tu clase debe incluir:- La tabla de la clase con
__indexapuntando a sí misma - Un constructor
:new()que cree una instancia, establezca su metatabla y la devuelva - Un método
:meow()que imprima el sonido del gato
- La tabla de la clase con
main.lua: Requiere tu módulo Cat y usa el constructor para crear una instancia de gato. Después, llama a su método para verificar que todo esté enlazado correctamente.
Recibirás una entrada: el número de veces que tu gato debe maullar.
Tu método :meow() debe imprimir exactamente:
Meow!En tu archivo principal, crea un gato usando Cat:new() y llama a :meow() el número de veces especificado.
Por ejemplo, si la entrada es 3, la salida debe ser:
Meow!
Meow!
Meow!Pruébalo tú mismo
-- Requiere el módulo Cat
local Cat = require('Cat')
-- Leer entrada: número de veces a maullar
local times = tonumber(io.read())
-- TODO: Crea una instancia de cat usando Cat:new()
-- TODO: Llama al método :meow() el número de veces especificado
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formasPractica por tu cuenta: Compilador de Lua online