Menu
Coddy logo textTech

Herencia de métodos

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

Una vez establecido el vínculo de herencia, las instancias de la clase hija obtienen automáticamente acceso a todos los métodos de la clase padre. Esto ocurre mediante la cadena de búsqueda de Lua: cuando llamas a un método en una instancia, Lua busca en cada tabla conectada hasta encontrar lo que estás buscando.

Considera esta configuración en la que Animal define un método :breathe():

local Animal = {}
Animal.__index = Animal

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

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

-- Dog hereda de Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})

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

Ahora observa qué sucede cuando creamos un Dog y llamamos al método del padre:

local buddy = Dog:new()
buddy:breathe()  -- Salida: Respirando...

La clase Dog nunca definió :breathe(), pero funciona. Lua primero comprueba buddy, no encuentra nada, después comprueba Dog, sigue sin encontrar nada y, finalmente, lo encuentra en Animal. Esta herencia automática de métodos significa que escribes el comportamiento compartido una sola vez en la clase padre y todas las clases hijas se benefician de inmediato.

challenge icon

Desafío

Fácil

¡Construyamos una jerarquía sencilla de criaturas para ver la herencia de métodos en acción! Crearás una clase padre Animal y una clase hija Dog, y después demostrarás que las instancias de Dog pueden usar métodos definidos únicamente en Animal.

Organizarás tu código en tres archivos:

  • Animal.lua: Define tu clase padre con el patrón de clase estándar. Incluye un constructor :new(name) que almacene el nombre del animal y un método :speak() que imprima el nombre del animal seguido de makes a sound. Devuelve la clase al final del archivo.
  • Dog.lua: Define tu clase hija que hereda de Animal. Requiere el módulo Animal y configura el vínculo de herencia para que Dog pueda acceder a los métodos de Animal. Incluye un constructor :new(name) que almacene el nombre y establezca Dog como la metatabla. La clase Dog NO debe definir su propio método :speak(). Lo heredará de Animal.
  • main.lua: Requiere tu módulo Dog, lee un nombre de la entrada, crea una instancia de Dog con ese nombre y llama al método :speak() en ella.

Recibirás una entrada: el nombre del perro.

Por ejemplo, si la entrada es Buddy, la salida debería ser:

Buddy makes a sound

La magia aquí es que tu clase Dog nunca define :speak(), pero llamarlo en una instancia de Dog funciona perfectamente. Lua sigue la cadena de búsqueda desde la instancia de Dog hasta la clase Dog y, después, hasta la clase Animal, donde encuentra el método. ¡Esta es la herencia en acción!

Pruébalo tú mismo

-- main.lua: Punto de entrada

local Dog = require('Dog')

-- Lee el nombre del perro desde la entrada
local name = io.read()

-- TODO: Crea una instancia de Dog con el nombre dado

-- TODO: Llama al método :speak() en la instancia del perro
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