0Pricing
Lua Academy · Lección

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
end

Creació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 Woof

Cadena 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)
end

Llamada 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
end

Orden 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
end

Lí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))  -- true

Copia 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

  1. Diseño de clases base y constructores
  2. Herencia multinivel
  3. Composición de mixins y comprobaciones de interfaces
  4. instanceof e introspección de tipos
← Volver a Lua Academy