Menu
Coddy logo textTech

Unabhängige Instanzen

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

Ein entscheidender Aspekt der objektorientierten Programmierung ist, dass jede Instanz ihren eigenen, separaten Zustand beibehält. Wenn Sie zwei Objekte aus derselben Klasse erstellen, sind diese völlig unabhängig voneinander – die Änderung des einen Objekts hat keine Auswirkungen auf das andere.

Betrachten Sie dieses Beispiel:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- Erstelle zwei separate Zähler
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- Ausgabe: 12
print(counterB.value)  -- Ausgabe: 5

Obwohl beide Zähler von derselben Counter-Klasse stammen, hat das Inkrementieren von counterA keine Auswirkungen auf counterB. Jedes Objekt hat sein eigenes value-Feld, das in seiner eigenen Instanztabelle gespeichert ist.

Diese Unabhängigkeit ist es, was Objekte nützlich macht. Sie können Dutzende von Spielern in einem Spiel erstellen, von denen jeder seine eigene Gesundheit und Punktzahl verfolgt. Sie können mehrere Bankkonten verwalten, jedes mit einem anderen Kontostand.

Die Klasse definiert die Struktur und das Verhalten, aber jede Instanz führt ihr eigenes Leben mit ihren eigenen Daten.

challenge icon

Aufgabe

Einfach

Lassen Sie uns beweisen, dass Objekte derselben Klasse wirklich ein unabhängiges Leben führen! Sie werden eine Wallet-Klasse erstellen und zwei separate Wallet-Instanzen anlegen. Anschließend werden Sie diese unabhängig voneinander modifizieren, um zu demonstrieren, dass Änderungen an der einen die andere nicht beeinflussen.

Sie werden Ihren Code auf zwei Dateien aufteilen:

  • Wallet.lua: Definieren Sie Ihre Wallet-Klasse mit dem Standard-Konstruktor-Muster. Jedes Wallet sollte sein eigenes balance-Attribut verwalten. Enthalten sein müssen:
    • Ein :new(startingBalance)-Konstruktor, der das Wallet mit dem angegebenen Betrag initialisiert
    • Eine :add(amount)-Methode, die das Guthaben erhöht
    • Eine :spend(amount)-Methode, die das Guthaben verringert
  • main.lua: Binden Sie Ihr Wallet-Modul ein und erstellen Sie zwei separate Wallet-Instanzen. Führen Sie unterschiedliche Operationen an jeder Instanz aus, um zu zeigen, dass sie einen unabhängigen Zustand beibehalten.

Sie erhalten vier Eingaben:

  1. Startguthaben für Wallet A
  2. Startguthaben für Wallet B
  3. Betrag, der zu Wallet A hinzugefügt werden soll
  4. Betrag, der von Wallet B ausgegeben werden soll

In Ihrer Hauptdatei:

  1. Erstellen Sie walletA mit dem ersten Startguthaben
  2. Erstellen Sie walletB mit dem zweiten Startguthaben
  3. Fügen Sie den angegebenen Betrag zu walletA hinzu
  4. Ziehen Sie den angegebenen Betrag von walletB ab
  5. Geben Sie beide Kontostände in separaten Zeilen aus

Geben Sie die endgültigen Kontostände in genau diesem Format aus:

Wallet A: [balance]
Wallet B: [balance]

Wenn die Eingaben beispielsweise 100, 50, 25 und 10 sind, sollte die Ausgabe wie folgt aussehen:

Wallet A: 125
Wallet B: 40

Beachten Sie, wie das Hinzufügen zu Wallet A Wallet B nicht verändert und das Ausgeben von Wallet B Wallet A nicht beeinflusst – jede Instanz behält ihr eigenes, separates Guthaben bei.

Spickzettel

Jede Instanz einer Klasse behält ihren eigenen, separaten Zustand bei. Das Erstellen mehrerer Objekte aus derselben Klasse führt zu völlig unabhängigen Instanzen – das Ändern einer Instanz hat keine Auswirkungen auf die anderen.

Beispiel zur Demonstration der Unabhängigkeit von Instanzen:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- Erstelle zwei separate Zähler
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- Ausgabe: 12
print(counterB.value)  -- Ausgabe: 5

Jedes Objekt verfügt über eine eigene Instanztabelle, in der seine eigenen Daten gespeichert sind. Die Klasse definiert die Struktur und das Verhalten, aber jede Instanz behält einen unabhängigen Zustand bei.

Probier es selbst

-- Erfordert das Wallet-Modul
local Wallet = require('Wallet')

-- Eingaben lesen
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())

-- TODO: Erstelle walletA mit dem ersten Startguthaben

-- TODO: Erstelle walletB mit dem zweiten Startguthaben

-- TODO: Füge den angegebenen Betrag zu walletA hinzu

-- TODO: Gib den angegebenen Betrag von walletB aus

-- TODO: Gib die endgültigen Kontostände im erforderlichen Format aus
-- Format: "Wallet A: [balance]" und "Wallet B: [balance]"
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