Unabhängige Instanzen
Teil des Abschnitts Objektorientierte Programmierung 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 du zwei Objekte aus derselben Klasse erstellst, sind sie vollständig unabhängig: Wenn du eines änderst, wirkt sich das nicht auf das andere aus.
Betrachte 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
-- Zwei separate Zähler erstellen
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 aus derselben Counter-Klasse stammen, hat das Erhöhen von counterA keinen Einfluss auf counterB. Jedes Objekt verfügt über ein eigenes value-Feld, das in seiner eigenen Instanztabelle gespeichert ist.
Diese Unabhängigkeit macht Objekte so nützlich. Du kannst in einem Spiel Dutzende von Spielern erstellen, wobei jeder seine eigene Gesundheit und Punktzahl verfolgt. Du kannst mehrere Bankkonten verwalten, jedes mit einem anderen Kontostand.
Die Klasse definiert die Struktur und das Verhalten, aber jede Instanz führt mit ihren eigenen Daten ihr eigenes Leben.
Aufgabe
EinfachBeweisen wir, dass Objekte derselben Klasse tatsächlich unabhängig voneinander existieren! Du erstellst eine Wallet-Klasse und zwei separate Wallet-Instanzen und änderst sie anschließend unabhängig voneinander, um zu zeigen, dass Änderungen an der einen die andere nicht beeinflussen.
Du organisierst deinen Code über zwei Dateien:
Wallet.lua: Definiere deineWallet-Klasse mit dem standardmäßigen Konstruktormuster. Jede Wallet soll ihren eigenenbalanceverfolgen. Füge Folgendes hinzu:- Einen
:new(startingBalance)-Konstruktor, der die Wallet mit dem angegebenen Betrag initialisiert - Eine
:add(amount)-Methode, die den Kontostand erhöht - Eine
:spend(amount)-Methode, die den Kontostand verringert
- Einen
main.lua: Binde dein Wallet-Modul ein und erstelle zwei separate Wallet-Instanzen. Führe für jede unterschiedliche Operationen aus, um zu zeigen, dass sie ihren unabhängigen Zustand beibehalten.
Du erhältst vier Eingaben:
- Anfangskontostand für Wallet A
- Anfangskontostand für Wallet B
- Zu Wallet A hinzuzufügender Betrag
- Aus Wallet B auszugebender Betrag
In deiner Hauptdatei:
- Erstelle
walletAmit dem ersten Anfangskontostand - Erstelle
walletBmit dem zweiten Anfangskontostand - Füge
walletAden angegebenen Betrag hinzu - Gib den angegebenen Betrag aus
walletBaus - Gib beide Kontostände in separaten Zeilen aus
Gib die endgültigen Kontostände in diesem exakten Format aus:
Wallet A: [balance]
Wallet B: [balance]Wenn die Eingaben beispielsweise 100, 50, 25 und 10 lauten, sollte die Ausgabe folgendermaßen aussehen:
Wallet A: 125
Wallet B: 40Beachte, dass das Hinzufügen zu Wallet A Wallet B nicht verändert und das Ausgeben aus Wallet B Wallet A nicht beeinflusst: Jede Instanz behält ihren eigenen separaten Kontostand.
Probier es selbst
-- Wallet-Modul einbinden
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 Guthaben 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 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