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...")
endAhora, 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.
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 imprimeMachine is operational. No olvides configurar__indexy 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__indexy establece el vínculo de herencia mediantesetmetatable(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 operationalEsta ú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"
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
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formasPractica por tu cuenta: Compilador de Lua online