Attribute initialisieren
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 9 von 70.
Der :new()-Konstruktor, den Sie gelernt haben, erzeugt Objekte, aber jede Instanz beginnt identisch. Echte Objekte benötigen eindeutige Daten – eine Person hat einen bestimmten Namen, ein Spieler hat einen Startpunktestand. Um Objekte nützlich zu machen, muss der Konstruktor Argumente akzeptieren und diese der neuen Instanz zuweisen.
So erweitern Sie den Konstruktor, um Initialwerte zu akzeptieren:
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)
endDer Konstruktor nimmt nun name und breed als Parameter entgegen. Nachdem die leere Instanz erstellt und ihre Metatabelle gesetzt wurde, weisen wir diese Werte direkt den Feldern der Instanz zu. Jedes erstellte Objekt wird sein eigenes name und breed haben.
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Ausgabe: Ich bin Rex, ein German Shepherd
dog2:introduce() -- Ausgabe: Ich bin Bella, ein PoodleBeide Hunde teilen sich dieselbe :introduce()-Methode aus dem Prototyp, aber jeder hat seinen eigenen einzigartigen Namen und seine eigene Rasse, die in seiner Instanztabelle gespeichert sind. Dies ist die Stärke der Kombination von Prototypen mit parametrisierten Konstruktoren – gemeinsames Verhalten mit individuellem Zustand.
Aufgabe
EinfachLassen Sie uns eine Person-Klasse erstellen, die einzigartige Individuen mit eigenen Namen und Altern erzeugt. Sie werden Ihren Code über zwei Dateien hinweg organisieren, um eine ordnungsgemäße Modulstruktur zu üben.
Sie werden Folgendes erstellen:
Person.lua: Definieren Sie IhrePerson-Klasse mit einem Konstruktor, der einen Namen und ein Alter akzeptiert. Fügen Sie eine:introduce()-Methode hinzu, mit der sich jede Person selbst vorstellen kann.main.lua: Binden Sie Ihr Person-Modul ein und erstellen Sie eine Personen-Instanz unter Verwendung der bereitgestellten Eingaben. Lassen Sie sie sich anschließend vorstellen.
Ihr :new(name, age)-Konstruktor sollte beide Werte akzeptieren und sie in der neuen Instanz speichern. Die :introduce()-Methode sollte genau in diesem Format drucken:
Hello, my name is [name] and I am [age] years oldSie erhalten zwei Eingaben:
- Der Name der Person
- Das Alter der Person
Wenn die Eingaben beispielsweise Alice und 25 sind, sollte die Ausgabe wie folgt lauten:
Hello, my name is Alice and I am 25 years oldSpickzettel
Um Objekte mit eindeutigen Daten zu erstellen, erweitern Sie den :new()-Konstruktor so, dass er Parameter akzeptiert und diese der Instanz zuweist:
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)
endErstellen Sie Instanzen mit unterschiedlichen Werten:
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Ausgabe: I am Rex, a German Shepherd
dog2:introduce() -- Ausgabe: I am Bella, a PoodleJedes Objekt verfügt über seine eigenen eindeutigen Daten, die in seiner Instanztabelle gespeichert sind, während es Methoden vom Prototyp gemeinsam nutzt.
Probier es selbst
-- Erfordert das Person-Modul
local Person = require('Person')
-- Eingabe lesen
local name = io.read()
local age = io.read()
-- TODO: Erstelle eine neue Person-Instanz mit Person:new(name, age)
-- TODO: Rufe die Methode introduce() für deine Person-Instanz auf
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-Klasse2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-Check