Instanzvariablen
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 12 von 70.
Willkommen zu einem neuen Kapitel, das sich darauf konzentriert, wie Objekte ihre internen Daten verwalten. Du hast gelernt, Klassen und Instanzen zu erstellen: Jetzt ist es an der Zeit zu erkunden, wie jede Instanz ihren eigenen eindeutigen Zustand speichert und verwaltet.
Instanzvariablen sind Felder, die ausschließlich zu einem einzelnen Objekt gehören. Wenn du innerhalb einer Methode oder eines Konstruktors einen Wert an self.something zuweist, existieren diese Daten nur in dieser bestimmten Instanz. Andere Objekte derselben Klasse haben ihre eigenen, getrennten Kopien.
Dies wird besonders wichtig, wenn komplexe Daten wie Tabellen gespeichert werden. Betrachte ein Inventarsystem, in dem jede Figur unterschiedliche Gegenstände mit sich führt:
local Inventory = {}
Inventory.__index = Inventory
function Inventory:new()
local instance = {}
setmetatable(instance, self)
instance.items = {} -- Jede Instanz erhält ihre eigene leere Tabelle
return instance
end
function Inventory:addItem(item)
table.insert(self.items, item)
endDie entscheidende Zeile ist instance.items = {}. Indem du innerhalb des Konstruktors eine neue leere Tabelle erstellst, erhält jedes Inventarobjekt eine eigene, separate Liste. Wenn du items stattdessen in der Klassentabelle selbst definieren würdest, würden alle Instanzen versehentlich dieselbe Tabelle gemeinsam verwenden: Wenn du einem Charakter ein Schwert hinzufügst, würde es jeder bekommen!
local bag1 = Inventory:new()
local bag2 = Inventory:new()
bag1:addItem("Sword")
bag2:addItem("Potion")
print(#bag1.items) -- Ausgabe: 1
print(#bag2.items) -- Ausgabe: 1Jedes Inventar verwaltet seine eigene Sammlung. Dieses Muster gilt immer dann, wenn eine Instanz Daten nachverfolgen muss, die sich unabhängig ändern: Listen, Zähler oder jeder veränderliche Zustand, der für dieses Objekt eindeutig ist.
Aufgabe
EinfachErstellen wir ein ShoppingCart-System, in dem jeder Warenkorb seine eigene separate Produktliste verwaltet. Dies zeigt, wie Instanzvariablen Daten zwischen Objekten isoliert halten: Das Hinzufügen von Artikeln zu einem Warenkorb wirkt sich nicht auf einen anderen aus!
Du wirst deinen Code auf zwei Dateien verteilen:
ShoppingCart.lua: Definiere deineShoppingCart-Klasse, bei der jede Instanz ihre eigeneproducts-Tabelle besitzt. Füge Folgendes hinzu:- Einen
:new()-Konstruktor, der für jeden Warenkorb eine leere Produktliste initialisiert - Eine
:addProduct(productName)-Methode, die ein Produkt zur Liste dieses Warenkorbs hinzufügt - Eine
:listProducts()-Methode, die jedes Produkt in einer eigenen Zeile ausgibt
- Einen
main.lua: Binde dein ShoppingCart-Modul ein und erstelle zwei separate Warenkörbe. Füge jedem Warenkorb unterschiedliche Produkte hinzu, um zu beweisen, dass sie unabhängige Bestände verwalten.
Du erhältst vier Eingaben:
- Erstes Produkt, das dem Warenkorb A hinzugefügt wird
- Zweites Produkt, das dem Warenkorb A hinzugefügt wird
- Erstes Produkt, das dem Warenkorb B hinzugefügt wird
- Zweites Produkt, das dem Warenkorb B hinzugefügt wird
In deiner Hauptdatei:
- Erstelle zwei Warenkörbe:
cartAundcartB - Füge die ersten beiden Produkte zu
cartAhinzu - Füge die letzten beiden Produkte zu
cartBhinzu - Gib
Cart A:aus und liste anschließend die Produkte von Warenkorb A auf - Gib
Cart B:aus und liste anschließend die Produkte von Warenkorb B auf
Wenn die Eingaben beispielsweise Apple, Bread, Milk und Eggs lauten, sollte die Ausgabe folgendermaßen aussehen:
Cart A:
Apple
Bread
Cart B:
Milk
EggsDenke daran: Entscheidend ist, products innerhalb des Konstruktors als neue leere Tabelle zu initialisieren. Dadurch erhält jede Warenkorbinstanz ihre eigene separate Liste, anstatt dass alle Warenkörbe dieselbe Tabelle gemeinsam verwenden.
Probier es selbst
-- Lade das ShoppingCart-Modul
local ShoppingCart = require('ShoppingCart')
-- Eingaben lesen
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()
-- TODO: Erstelle zwei Einkaufswagen: cartA und cartB
-- TODO: Füge product1 und product2 zu cartA hinzu
-- TODO: Füge product3 und product4 zu cartB hinzu
-- TODO: Gib "Cart A:" aus und liste dann die Produkte von cartA auf
-- TODO: Gib "Cart B:" aus und liste dann die Produkte von cartB auf
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
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-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-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Übe selbstständig: Online-Lua-Compiler