Menu
Coddy logo textTech

Configuración de la herencia

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 31 de 70.

Hasta ahora, has creado clases en las que cada objeto busca métodos en una única tabla de prototipos. Pero ¿qué ocurre si quieres que una clase se base en otra? Aquí es donde entra en juego la herencia: una clase hija puede acceder a todo lo de una clase padre y, al mismo tiempo, añadir sus propias características.

La idea clave es que una tabla de class en sí misma puede tener una metatable. Cuando Lua no puede encontrar algo en la clase hija, busca en el __index de la metatable de la clase hija, que apunta a la clase principal.

-- Clase padre
local Animal = {}
Animal.__index = Animal

function Animal:new()
    local obj = {}
    setmetatable(obj, Animal)
    return obj
end

function Animal:breathe()
    print("Breathing...")
end

Ahora, esta es la configuración de la herencia. Creamos una clase hija y configuramos su metatabla para que consulte a la clase padre:

-- Clase hija
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

Esta única línea, setmetatable(Dog, {__index = Animal}), crea el vínculo de herencia. Cuando una instancia de Dog llama a un método que no se encuentra en Dog, Lua comprueba Animal.

La cadena de búsqueda funciona así: instancia → Dog → Animal. Cada paso usa __index para encontrar la siguiente tabla en la que buscar. Esto permite que las clases hijas hereden automáticamente todos los métodos de las clases padre sin copiarlos.

challenge icon

Desafío

Fácil

¡Construyamos tu primera jerarquía de herencia! Crearás una relación sencilla de clase principal y clase secundaria, donde una clase Machine sirve como base y una clase Robot hereda de ella.

Organizarás tu código en tres archivos:

  • Machine.lua: Define tu clase principal con el patrón de clase estándar. Incluye un constructor :new() y un método :status() que imprime Machine is operational. No olvides configurar __index y devolver la clase al final del archivo.
  • Robot.lua: Define tu clase secundaria, que hereda de Machine. Requiere el módulo Machine, configura la tabla Robot con su propio __index y establece el vínculo de herencia mediante setmetatable(Robot, {__index = Machine}). Incluye un constructor :new() que crea una instancia con Robot como su metatabla.
  • main.lua: Une todo requiriendo tu módulo Robot, creando una instancia de Robot y llamando al método heredado :status().

El concepto clave aquí es que tu clase Robot no define :status() por sí misma. Hereda este método de Machine a través de la cadena de metatablas. Cuando llamas a :status() en una instancia de Robot, Lua buscará primero en Robot; al no encontrarlo, seguirá el vínculo __index hasta Machine, donde descubrirá el método.

Tu salida debería ser:

Machine is operational

Esta única línea demuestra que la herencia funciona. ¡Tu Robot accedió correctamente a un método definido únicamente en su clase principal!

Pruébalo tú mismo

-- main.lua: Reúne todo

-- TODO: Requiere el módulo Robot

-- TODO: Crea una instancia de Robot usando Robot:new()

-- TODO: Llama al método heredado :status() en tu instancia de robot
-- This should print "Machine is operational"
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