Herencia multinivel
Admite cadenas de herencia profundas con una delegación adecuada de __index.
Herencia multinivel es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 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.
Repaso de la herencia simple
La herencia simple se consigue estableciendo Child.__index = Parent. Para buscar un método, si no está en Child, se busca en Parent mediante __index.
Ampliación de la fábrica de clases para la herencia
Añada un método :extend() a la clase base que cree una subclase vinculada a la clase principal.
function Animal:extend()
local cls = {}
cls.__index = cls
setmetatable(cls, {__index = self})
cls.super = self
function cls:new(...)
local inst = setmetatable({}, cls)
if inst.init then inst:init(...) end
return inst
end
return cls
endCreación de una subclase
Cree Dog como subclase de Animal, redefina init y añada nuevos métodos.
local Dog = Animal:extend()
function Dog:init(name)
Dog.super.init(self, name, "Woof")
self.tricks = {}
end
function Dog:learnTrick(trick)
self.tricks[#self.tricks+1] = trick
end
local d = Dog:new("Rex")
d:learnTrick("sit")
d:speak() -- Rex says WoofCadena de varios niveles
Extienda Dog para crear GuideDog: una cadena de herencia de tres niveles.
local GuideDog = Dog:extend()
function GuideDog:init(name, owner)
GuideDog.super.init(self, name)
self.owner = owner
end
function GuideDog:guide()
print(self.name .. " guides " .. self.owner)
endLlamada a métodos super
Llame siempre a super mediante la referencia de clase, no mediante self, para evitar la recursión infinita.
function Dog:init(name)
Dog.super.init(self, name, "Woof") -- explicit super call
endOrden de resolución de métodos
Lua resuelve los métodos desde abajo hacia arriba a través de las cadenas de __index. GuideDog → Dog → Animal → nil. Gana el primer método encontrado.
Redefinición de métodos
Defina en la subclase un método con el mismo nombre para redefinirlo. Llame explícitamente a super para realizar redefiniciones parciales.
function Dog:speak()
print(self.name .. " barks!")
Dog.super.speak(self) -- also call parent speak
endLímites de profundidad
Las cadenas de herencia muy profundas ralentizan la búsqueda de métodos (cada nivel añade un paso de __index). Prefiera la composición cuando haya más de 3 o 4 niveles.
Comprobación de pertenencia a una clase
Recorra la cadena de metatablas para comprobar si una instancia pertenece a una clase.
local function isA(instance, cls)
local mt = getmetatable(instance)
while mt do
if mt == cls then return true end
mt = getmetatable(mt)
end
return false
end
print(isA(d, Dog)) -- true
print(isA(d, Animal)) -- trueCopia profunda conservando la clase
Al copiar instancias en profundidad, conserve la metatabla para que la copia siga siendo una instancia de la clase correcta.
Cuándo preferir la composición
Utilice la herencia para relaciones verdaderas de tipo «es-un» (Dog es un Animal). Utilice la composición (tablas de componentes) para relaciones de tipo «tiene-un» o para combinar comportamientos de forma flexible.
Pregunta sobre la herencia
¿Cómo funciona la herencia de varios niveles en Lua?
Repaso: herencia de varios niveles
Amplíe la fábrica de clases con un método :extend() que encadene enlaces __index. Llame explícitamente a super con ClassName.super.method(self, ...). Compruebe la pertenencia recorriendo la cadena de metatablas.
Preguntas frecuentes
¿La lección «Herencia multinivel» es gratis?
Sí — el texto completo de «Herencia multinivel» 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 «Herencia multinivel»?
Admite cadenas de herencia profundas con una delegación adecuada de __index. 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 2 de 4.
¿Cuánto tiempo toma la lección «Herencia multinivel»?
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