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: 5Obwohl 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.
Aufgabe
EinfachLassen 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 IhreWallet-Klasse mit dem Standard-Konstruktor-Muster. Jedes Wallet sollte sein eigenesbalance-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
- Ein
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:
- Startguthaben für Wallet A
- Startguthaben für Wallet B
- Betrag, der zu Wallet A hinzugefügt werden soll
- Betrag, der von Wallet B ausgegeben werden soll
In Ihrer Hauptdatei:
- Erstellen Sie
walletAmit dem ersten Startguthaben - Erstellen Sie
walletBmit dem zweiten Startguthaben - Fügen Sie den angegebenen Betrag zu
walletAhinzu - Ziehen Sie den angegebenen Betrag von
walletBab - 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: 40Beachten 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: 5Jedes 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]"
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