Inicialización de atributos
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 9 de 70.
El constructor :new() que aprendiste crea objetos, pero cada instancia comienza siendo idéntica. Los objetos reales necesitan datos únicos: una persona tiene un nombre específico, un jugador tiene una puntuación inicial. Para que los objetos sean útiles, el constructor debe aceptar argumentos y asignarlos a la nueva instancia.
Aquí se explica cómo expandir el constructor para aceptar valores iniciales:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endEl constructor ahora toma name y breed como parámetros. Después de crear la instancia vacía y establecer su metatable, asignamos estos valores directamente a los campos de la instancia. Cada objeto creado tendrá su propio name y breed.
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Salida: Soy Rex, un Pastor Alemán
dog2:introduce() -- Salida: Soy Bella, un CanicheAmbos perros comparten el mismo método :introduce() del prototipo, pero cada uno tiene su propio nombre y raza únicos almacenados en su tabla de instancia. Este es el poder de combinar prototipos con constructores parametrizados: comportamiento compartido con estado individual.
Desafío
FácilVamos a construir una clase Person que cree individuos únicos con sus propios nombres y edades. Organizarás tu código en dos archivos para practicar la estructura adecuada de módulos.
Crearás:
Person.lua: Define tu clasePersoncon un constructor que acepte un nombre y una edad. Incluye un método:introduce()que permita a cada persona presentarse.main.lua: Requiere tu módulo Person y crea una instancia de persona utilizando las entradas proporcionadas. Luego, haz que se presente.
Tu constructor :new(name, age) debe aceptar ambos valores y almacenarlos en la nueva instancia. El método :introduce() debe imprimir en este formato exacto:
Hello, my name is [name] and I am [age] years oldRecibirás dos entradas:
- El nombre de la persona
- La edad de la persona
Por ejemplo, si las entradas son Alice y 25, la salida debe ser:
Hello, my name is Alice and I am 25 years oldHoja de referencia
Para crear objetos con datos únicos, expande el constructor :new() para que acepte parámetros y los asigne a la instancia:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endCrea instancias con diferentes valores:
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Salida: I am Rex, a German Shepherd
dog2:introduce() -- Salida: I am Bella, a PoodleCada objeto tiene sus propios datos únicos almacenados en su tabla de instancia, mientras comparte métodos del prototipo.
Pruébalo tú mismo
-- Requerir el módulo Person
local Person = require('Person')
-- Leer entrada
local name = io.read()
local age = io.read()
-- TODO: Crear una nueva instancia de Person usando Person:new(name, age)
-- TODO: Llamar al método introduce() en tu instancia de person
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Object Oriented Programming
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 formas