Diseño de clases base y constructores
Diseñe una fábrica Class() que configure metatablas y constructores new().
Diseño de clases base y constructores es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
Objetivo: una fábrica de clases reutilizable
Queremos una función Class() que devuelva un nuevo objeto de clase con un constructor adecuado, búsqueda de métodos y semántica de POO correctas.
Esqueleto de la fábrica de clases
La fábrica crea una tabla de clase con una metatabla para despachar los métodos.
local function Class()
local cls = {}
cls.__index = cls
cls.__name = "AnonymousClass"
function cls:new(...)
local instance = setmetatable({}, cls)
if instance.init then instance:init(...) end
return instance
end
return cls
endDefinición de una clase
Cree una clase, defina init (el constructor) y añada métodos.
local Animal = Class()
Animal.__name = "Animal"
function Animal:init(name, sound)
self.name = name
self.sound = sound
end
function Animal:speak()
print(self.name .. " says " .. self.sound)
end
local cat = Animal:new("Cat", "Meow")
cat:speak() -- Cat says MeowPatrón del constructor
El constructor :new(...) crea una instancia mediante setmetatable({}, cls) y después llama a :init(...) para inicializarla. Esto separa la asignación de la inicialización.
Nombre de clase para depuración
Almacene cls.__name y defina __tostring para que las instancias se muestren de forma significativa.
function Animal:__tostring()
return "<" .. Animal.__name .. ": " .. self.name .. ">"
end
print(tostring(cat)) -- <Animal: Cat>Valores predeterminados en init
Proporcione valores predeterminados en init utilizando or.
function Vehicle:init(opts)
self.speed = opts.speed or 0
self.fuel = opts.fuel or 100
self.engine = opts.engine or "petrol"
endMétodos de clase frente a métodos de instancia
Los métodos definidos con function cls.method() son métodos de clase (no reciben self). Los métodos definidos con function cls:method() reciben la instancia como self.
Propiedades estáticas
Las propiedades establecidas directamente en la tabla de clase se comparten entre todas las instancias, a menos que los campos de instancia las oculten.
Animal.count = 0
function Animal:init(name, sound)
Animal.count = Animal.count + 1
self.name = name; self.sound = sound
end
print(Animal.count) -- 0
Animal:new("Dog","Woof")
print(Animal.count) -- 1Constructor de copia
Un método :clone() crea una copia de una instancia copiando superficialmente sus campos.
function Animal:clone()
local copy = setmetatable({}, getmetatable(self))
for k, v in pairs(self) do copy[k] = v end
return copy
endMetamétodo de igualdad
Defina __eq para realizar comparaciones de igualdad significativas entre instancias.
Animal.__eq = function(a, b)
return a.name == b.name
end¿Por qué no utilizar rawget?
Utilice self.field (no rawget) para permitir el acceso a campos mediante metamétodos en las clases derivadas. Utilice rawget únicamente cuando necesite omitir explícitamente ese mecanismo.
Pregunta sobre el diseño del constructor
¿Por qué se llama a init por separado del asignador new?
Repaso: clase base y constructor
Una fábrica Class() crea una tabla como clase, establece __index = cls para buscar métodos y proporciona :new() y :init(). Esta es la base de todos los patrones de POO en Lua.
Preguntas frecuentes
¿La lección «Diseño de clases base y constructores» es gratis?
Sí — el texto completo de «Diseño de clases base y constructores» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Diseño de clases base y constructores»?
Diseñe una fábrica Class() que configure metatablas y constructores new(). Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Diseño de clases base y constructores»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Diseño de clases base y constructores
- Herencia multinivel
- Composición de mixins y comprobaciones de interfaces
- instanceof e introspección de tipos