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
endAhora 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.
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 demakes 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 soundLa 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
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