Menu
Coddy logo textTech

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
end

Warum 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: Luna

Dieses 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.

challenge icon

Aufgabe

Einfach

Lass 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 deine Player-Klasse mit dem Standard-Prototyp-Muster. Der Konstruktor sollte einen Namen akzeptieren und die Gesundheit auf 100 initialisieren. 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] HP

Du 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:

  1. Der Name des Spielers (unter Verwendung von :getName())
  2. Die Gesundheit des Spielers (unter Verwendung von :getHealth())
  3. 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 HP

Spickzettel

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
end

Verwendung von Getter-Methoden:

local hero = Player:new("Luna")
print(hero:getHealth())  -- Ausgabe: 100
print(hero:getName())    -- Ausgabe: Luna

Getter 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
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