Setter-Methoden
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 14 von 70.
Getter-Methoden ermöglichen es dir, interne Daten über einen kontrollierten Zugriffspunkt zu lesen. Setter-Methoden (auch Mutator-Methoden genannt) tun das Gegenteil. Sie bieten eine kontrollierte Möglichkeit, den internen Zustand zu ändern.
Anstatt car.speed = 50 direkt zuzuweisen, rufst du car:setSpeed(50) auf:
local Car = {}
Car.__index = Car
function Car:new()
local instance = {}
setmetatable(instance, self)
instance.speed = 0
return instance
end
function Car:setSpeed(newSpeed)
self.speed = newSpeed
end
function Car:getSpeed()
return self.speed
endAuf den ersten Blick scheint das zusätzliche Arbeit für dasselbe Ergebnis zu sein. Setter werden jedoch mächtig, wenn du später Regeln hinzufügen musst. Stell dir vor, du möchtest sicherstellen, dass die Geschwindigkeit niemals negativ wird oder einen Höchstwert überschreitet:
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
endJetzt durchläuft jede Geschwindigkeitsänderung deine Validierungslogik. Jeder Code, der :setSpeed() verwendet, profitiert automatisch von diesen Prüfungen, ohne dass Änderungen erforderlich sind. Das ist der eigentliche Wert von Settern. Sie schaffen eine zentrale Stelle, an der du kontrollierst, wie sich Daten ändern, und machen deine Objekte dadurch sicherer und leichter zu warten.
Aufgabe
EinfachErstelle eine Thermostat-Klasse, die mithilfe von Setter-Methoden die Temperatur auf intelligente Weise steuert. Anstatt jeden beliebigen Temperaturwert zuzulassen, setzt dein Thermostat sinnvolle Grenzen und hält die Temperatur innerhalb eines angenehmen Bereichs.
Du organisierst deinen Code auf zwei Dateien:
Thermostat.lua: Definiere deineThermostat-Klasse mit dem standardmäßigen Prototyp-Muster. Jedes Thermostat soll seine aktuelletemperaturespeichern. Füge Folgendes hinzu:- Einen
:new()-Konstruktor, der die Temperatur auf20(einen angenehmen Standardwert) initialisiert - Einen
:getTemperature()-Getter, der die aktuelle Temperatur zurückgibt - Einen
:setTemperature(newTemp)-Setter, der die Temperatur aktualisiert, sie aber innerhalb der Grenzen hält: Minimum10und Maximum30
- Einen
main.lua: Binde dein Thermostat-Modul ein und erstelle eine Thermostat-Instanz. Verwende den Setter, um verschiedene Temperaturänderungen zu versuchen, und beobachte, wie die Grenzen durchgesetzt werden.
Deine :setTemperature()-Methode soll diese Regeln durchsetzen:
- Wenn die neue Temperatur unter
10liegt, setze sie auf10 - Wenn die neue Temperatur über
30liegt, setze sie auf30 - Andernfalls setze sie auf den angeforderten Wert
Du erhältst zwei Eingaben:
- Erste zu setzende Temperatur
- Zweite zu setzende Temperatur
Erstelle in deiner Hauptdatei ein Thermostat und:
- Gib die Anfangstemperatur aus
- Setze die Temperatur auf den ersten Eingabewert und gib das Ergebnis aus
- Setze die Temperatur auf den zweiten Eingabewert und gib das Ergebnis aus
Gib jede Temperatur in einer eigenen Zeile aus (nur die Zahl).
Wenn die Eingaben beispielsweise 25 und 50 lauten, sollte die Ausgabe wie folgt aussehen:
20
25
30Beachte, dass der zweite Versuch, 50 zu setzen, zu 30 führt: Der Setter setzt automatisch die maximale Grenze durch!
Probier es selbst
-- Thermostat-Modul einbinden
local Thermostat = require('Thermostat')
-- Eingabe lesen
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: Erstelle eine Thermostat-Instanz
-- TODO: Gib die Anfangstemperatur aus
-- TODO: Setze die Temperatur auf temp1 und gib das Ergebnis aus
-- TODO: Setze die Temperatur auf temp2 und gib das Ergebnis aus
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