Getter-Methoden
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 13 von 70.
Du hast gelernt, Daten in Instanzvariablen wie self.health oder self.items zu speichern. Während du auf diese Felder direkt von außerhalb des Objekts zugreifen kannst, gibt es einen saubereren Ansatz: die Verwendung von Getter-Methoden.
Ein Getter (auch Akzessor-Methode genannt) ist eine einfache Methode, die einen internen Wert zurückgibt. Anstatt direkt auf player.health zuzugreifen, rufen Sie player:getHealth() auf:
local Player = {}
Player.__index = Player
function Player:new(name)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.health = 100
return instance
end
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endWarum der Aufwand mit einer zusätzlichen Methode? Getter bieten einen kontrollierten Zugriffspunkt auf Ihre Daten.
Im Moment gibt :getHealth() einfach den Wert zurück. Aber später möchten Sie vielleicht Logik hinzufügen – vielleicht die Rückgabe von "Critical", wenn die Gesundheit unter 10 fällt, oder eine Protokollierung bei jeder Überprüfung der Gesundheit.
Mit einem vorhandenen Getter können Sie diese Änderungen vornehmen, ohne den Code zu ändern, der das Objekt verwendet.
local hero = Player:new("Luna")
print(hero:getHealth()) -- Ausgabe: 100
print(hero:getName()) -- Ausgabe: LunaDieses Muster schafft eine klare Grenze zwischen der internen Struktur eines Objekts und der Art und Weise, wie anderer Code mit ihm interagiert. Die Außenwelt fragt Daten über Methoden ab, anstatt direkt auf die Felder des Objekts zuzugreifen.
Aufgabe
EinfachLass uns eine Player-Klasse erstellen, die Getter-Methoden verwendet, um auf ihre internen Daten zuzugreifen. Anstatt direkt auf die Felder des Spielers zuzugreifen, wirst du Methoden erstellen, die einen kontrollierten Zugriff auf die Informationen des Spielers ermöglichen.
Du wirst deinen Code auf zwei Dateien aufteilen:
Player.lua: Definiere deinePlayer-Klasse mit dem Standard-Prototyp-Muster. Der Konstruktor sollte einen Namen akzeptieren und die Gesundheit auf100initialisieren. Füge drei Getter-Methoden hinzu::getName()gibt den Namen des Spielers zurück:getHealth()gibt die aktuelle Gesundheit des Spielers zurück:getStatus()gibt einen formatierten String zurück, der beide Informationen kombiniert
main.lua: Binde dein Player-Modul ein und erstelle eine Spieler-Instanz. Verwende die Getter-Methoden, um die Informationen des Spielers anzuzeigen – greife auf alles über Methoden zu, anstatt Felder direkt zu lesen.
Deine :getStatus()-Methode sollte einen String in genau diesem Format zurückgeben:
[name] has [health] HPDu erhältst eine Eingabe: den Namen des Spielers.
Erstelle in deiner Hauptdatei einen Spieler mit dem angegebenen Namen und gib dann drei Zeilen unter Verwendung deiner Getter-Methoden aus:
- Der Name des Spielers (unter Verwendung von
:getName()) - Die Gesundheit des Spielers (unter Verwendung von
:getHealth()) - Der vollständige Status des Spielers (unter Verwendung von
:getStatus())
Wenn die Eingabe beispielsweise Luna ist, sollte die Ausgabe wie folgt aussehen:
Luna
100
Luna has 100 HPSpickzettel
Eine Getter-Methode (oder Accessor-Methode) ist eine Methode, die einen internen Wert eines Objekts zurückgibt. Anstatt direkt auf Felder zuzugreifen, rufen Sie eine Methode auf, um die Daten abzurufen.
Grundlegende Getter-Methoden:
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endVerwendung von Getter-Methoden:
local hero = Player:new("Luna")
print(hero:getHealth()) -- Ausgabe: 100
print(hero:getName()) -- Ausgabe: LunaGetter bieten einen kontrollierten Zugriffspunkt auf Ihre Daten. Sie schaffen eine klare Grenze zwischen der internen Struktur eines Objekts und der Art und Weise, wie anderer Code damit interagiert. Dies ermöglicht es Ihnen, später Logik (wie Validierung oder Protokollierung) hinzuzufügen, ohne den Code zu ändern, der das Objekt verwendet.
Probier es selbst
-- Erfordert das Player-Modul
local Player = require('Player')
-- Eingabe lesen
local name = io.read()
-- TODO: Erstelle eine Spieler-Instanz mit dem angegebenen Namen
-- TODO: Gib den Namen des Spielers mit :getName() aus
-- TODO: Gib die Gesundheit des Spielers mit :getHealth() aus
-- TODO: Gib den Status des Spielers mit :getStatus() aus
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