Menu
Coddy logo textTech

Instanzvariablen

Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 12 von 70.

Willkommen zu einem neuen Kapitel, das sich darauf konzentriert, wie Objekte ihre internen Daten verwalten. Sie haben gelernt, Klassen und Instanzen zu erstellen – jetzt ist es an der Zeit zu untersuchen, wie jede Instanz ihren eigenen, einzigartigen Zustand speichert und verwaltet.

Instanzvariablen sind Felder, die exklusiv zu einem einzelnen Objekt gehören. Wenn Sie einen Wert an self.something innerhalb einer Methode oder eines Konstruktors zuweisen, leben diese Daten nur in dieser speziellen Instanz. Andere Objekte derselben Klasse haben ihre eigenen separaten Kopien.

Dies wird besonders wichtig, wenn komplexe Daten wie Tabellen gespeichert werden. Stellen Sie sich ein Inventarsystem vor, in dem jeder Charakter verschiedene Gegenstände trägt:

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 = {}. Durch das Erstellen einer neuen leeren Tabelle innerhalb des Konstruktors erhält jedes Inventar-Objekt seine eigene, separate Liste. Wenn Sie stattdessen items in der Klassentabelle selbst definieren würden, würden alle Instanzen versehentlich dieselbe Tabelle teilen – das Hinzufügen eines Schwertes zu einem Charakter würde es jedem geben!

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 findet immer dann Anwendung, wenn eine Instanz Daten verfolgen muss, die sich unabhängig ändern – Listen, Zähler oder jeder veränderliche Zustand, der für dieses Objekt spezifisch ist.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein ShoppingCart-System bauen, bei dem jeder Warenkorb seine eigene separate Liste von Produkten verwaltet. Dies wird demonstrieren, wie Instanzvariablen Daten zwischen Objekten isoliert halten – das Hinzufügen von Artikeln zu einem Warenkorb hat keine Auswirkungen auf einen anderen!

Sie werden Ihren Code in zwei Dateien organisieren:

  • ShoppingCart.lua: Definieren Sie Ihre ShoppingCart-Klasse, in der jede Instanz ihre eigene products-Tabelle hat. Fügen Sie Folgendes hinzu:
    • Einen :new()-Konstruktor, der eine leere Produktliste für jeden Warenkorb initialisiert
    • Eine :addProduct(productName)-Methode, die ein Produkt zur Liste dieses Warenkorbs hinzufügt
    • Eine :listProducts()-Methode, die jedes Produkt in einer separaten Zeile ausgibt
  • main.lua: Binden Sie Ihr ShoppingCart-Modul ein und erstellen Sie zwei separate Warenkörbe. Fügen Sie jedem Warenkorb unterschiedliche Produkte hinzu, um zu beweisen, dass sie unabhängige Bestände führen.

Sie erhalten vier Eingaben:

  1. Erstes Produkt, das zu Warenkorb A hinzugefügt werden soll
  2. Zweites Produkt, das zu Warenkorb A hinzugefügt werden soll
  3. Erstes Produkt, das zu Warenkorb B hinzugefügt werden soll
  4. Zweites Produkt, das zu Warenkorb B hinzugefügt werden soll

In Ihrer Hauptdatei:

  1. Erstellen Sie zwei Warenkörbe: cartA und cartB
  2. Fügen Sie die ersten beiden Produkte zu cartA hinzu
  3. Fügen Sie die letzten beiden Produkte zu cartB hinzu
  4. Geben Sie Cart A: aus und listen Sie dann die Produkte von Warenkorb A auf
  5. Geben Sie Cart B: aus und listen Sie dann die Produkte von Warenkorb B auf

Wenn die Eingaben beispielsweise Apple, Bread, Milk und Eggs sind, sollte die Ausgabe wie folgt aussehen:

Cart A:
Apple
Bread
Cart B:
Milk
Eggs

Denken Sie daran: Der Schlüssel liegt darin, products als neue leere Tabelle innerhalb des Konstruktors zu initialisieren. Dies stellt sicher, dass jede Warenkorb-Instanz ihre eigene separate Liste erhält, anstatt eine Tabelle über alle Warenkörbe hinweg zu teilen.

Spickzettel

Instanzvariablen sind Felder, die exklusiv zu einem einzelnen Objekt gehören. Wenn Sie einem Wert self.something innerhalb einer Methode oder eines Konstruktors zuweisen, existieren diese Daten nur in dieser speziellen Instanz.

Um Instanzvariablen zu erstellen, initialisieren Sie diese innerhalb des Konstruktors, indem Sie für jede Instanz eine neue Tabelle verwenden:

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

Der entscheidende Punkt ist instance.items = {} – das Erstellen einer neuen leeren Tabelle innerhalb des Konstruktors stellt sicher, dass jedes Objekt seine eigenen, separaten Daten erhält. Wenn Sie items in der Klassentabelle selbst definiert hätten, würden alle Instanzen dieselbe Tabelle teilen.

local bag1 = Inventory:new()
local bag2 = Inventory:new()

bag1:addItem("Sword")
bag2:addItem("Potion")

print(#bag1.items)  -- Output: 1
print(#bag2.items)  -- Output: 1

Jede Instanz verwaltet ihre eigene Sammlung unabhängig voneinander. Dieses Muster gilt für jeden veränderlichen Zustand, der für ein Objekt einzigartig ist – Listen, Zähler oder andere Daten, die sich pro Instanz ändern.

Probier es selbst

-- Erfordert 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 Warenkörbe: cartA und cartB

-- TODO: Füge product1 und product2 zu cartA hinzu

-- TODO: Füge product3 und product4 zu cartB hinzu

-- TODO: Drucke "Cart A:" und liste dann die Produkte von cartA auf

-- TODO: Drucke "Cart B:" 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 Object Oriented Programming