Menu
Coddy logo textTech

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)
end

Die 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: 1

Jedes 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.

challenge icon

Aufgabe

Einfach

Erstellen 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 deine ShoppingCart-Klasse, bei der jede Instanz ihre eigene products-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
  • 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:

  1. Erstes Produkt, das dem Warenkorb A hinzugefügt wird
  2. Zweites Produkt, das dem Warenkorb A hinzugefügt wird
  3. Erstes Produkt, das dem Warenkorb B hinzugefügt wird
  4. Zweites Produkt, das dem Warenkorb B hinzugefügt wird

In deiner Hauptdatei:

  1. Erstelle zwei Warenkörbe: cartA und cartB
  2. Füge die ersten beiden Produkte zu cartA hinzu
  3. Füge die letzten beiden Produkte zu cartB hinzu
  4. Gib Cart A: aus und liste anschließend die Produkte von Warenkorb A auf
  5. 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
Eggs

Denke 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler