Menu
Coddy logo textTech

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!")
end

Desglosemos 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.

challenge icon

Desafío

Fácil

Construyamos 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 clase Cat con el patrón de constructor completo. Tu clase debe incluir:
    • La tabla de la clase con __index apuntando 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
    Devuelve la tabla de la clase al final del archivo.
  • 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
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Lua online