Metody ustawiające
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 14 z 70.
Metody pobierające umożliwiają odczyt wewnętrznych danych za pomocą kontrolowanego punktu dostępu. Metody ustawiające (nazywane także metodami modyfikującymi) działają odwrotnie. Zapewniają kontrolowany sposób na modyfikowanie stanu wewnętrznego.
Zamiast bezpośrednio przypisywać car.speed = 50, wywołujesz car:setSpeed(50):
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
endNa pierwszy rzut oka wydaje się, że to dodatkowa praca, która daje ten sam rezultat. Settery stają się jednak przydatne, gdy później trzeba dodać reguły. Wyobraź sobie, że chcesz mieć pewność, że prędkość nigdy nie będzie ujemna ani nie przekroczy maksimum:
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
endTeraz każda zmiana prędkości przechodzi przez logikę walidacji. Każdy kod używający :setSpeed() automatycznie korzysta z tych kontroli bez modyfikacji. Na tym polega prawdziwa wartość setterów. Tworzą one jeden punkt, w którym kontrolujesz sposób zmiany danych, dzięki czemu Twoje obiekty są bezpieczniejsze i łatwiejsze w utrzymaniu.
Wyzwanie
ŁatwyZbudujmy klasę Thermostat, która używa metod ustawiających do inteligentnego kontrolowania temperatury. Zamiast dopuszczać dowolną wartość temperatury, termostat będzie wymuszać rozsądne limity, utrzymując temperaturę w komfortowym zakresie.
Rozmieścisz swój kod w dwóch plikach:
Thermostat.lua: Zdefiniuj klasęThermostatprzy użyciu standardowego wzorca prototypowego. Każdy termostat powinien śledzić bieżącątemperature. Uwzględnij:- Konstruktor
:new(), który ustawia początkową temperaturę na20(komfortową wartość domyślną) - Getter
:getTemperature(), który zwraca bieżącą temperaturę - Setter
:setTemperature(newTemp), który aktualizuje temperaturę, ale utrzymuje ją w określonych granicach: minimum10i maksimum30
- Konstruktor
main.lua: Zaimportuj moduł Thermostat i utwórz instancję termostatu. Użyj settera, aby spróbować różnych zmian temperatury i zaobserwuj, jak wymuszane są limity.
Metoda :setTemperature() powinna wymuszać następujące zasady:
- Jeśli nowa temperatura jest niższa niż
10, ustaw ją na10 - Jeśli nowa temperatura jest wyższa niż
30, ustaw ją na30 - W przeciwnym razie ustaw ją na żądaną wartość
Otrzymasz dwa dane wejściowe:
- Pierwsza temperatura do ustawienia
- Druga temperatura do ustawienia
W pliku głównym utwórz termostat, a następnie:
- Wyświetl początkową temperaturę
- Ustaw temperaturę na wartość pierwszego wejścia i wyświetl wynik
- Ustaw temperaturę na wartość drugiego wejścia i wyświetl wynik
Wyświetl każdą temperaturę w osobnym wierszu (samą liczbę).
Na przykład, jeśli danymi wejściowymi są 25 i 50, wynikiem powinno być:
20
25
30Zauważ, że druga próba ustawienia wartości 50 daje w wyniku 30: setter automatycznie wymusza maksymalny limit!
Spróbuj swoich sił
-- Załaduj moduł Thermostat
local Thermostat = require('Thermostat')
-- Odczytaj dane wejściowe
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: Utwórz instancję termostatu
-- TODO: Wypisz początkową temperaturę
-- TODO: Ustaw temperaturę na temp1 i wypisz wynik
-- TODO: Ustaw temperaturę na temp2 i wypisz wynik
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Koncepcja „self”
Tabele z funkcjamiJawne „self”Składnia z dwukropkiemKropka czy dwukropekPodsumowanie — poruszający się punkt4Projekt: Bank cyfrowy
Konfiguracja projektuMetoda wpłaty7Polimorfizm i nadpisywanie
Nadpisywanie metodWywoływanie metod klasy nadrzędnejTypowanie kaczeWspólny interfejsSprawdzanie typuPodsumowanie — role pracowników10Projekt: Menedżer kształtów
Konfiguracja projektuKlasa prostokątaKlasa kołaMetoda obwoduKolekcja kształtówPole całkowiteFiltrowanie kształtów2Wzorzec prototypu klasy
Koncepcja prototypuŁączenie za pomocą __indexKonstruktor :new()Inicjalizacja atrybutówNiezależne instancjePodsumowanie – fabryka samochodów5Przeciążanie operatorów w OOP
Dodawanie obiektówOdejmowanie obiektówŁączenie obiektówPorównywanie obiektów (<, >)Powtórka — działania na portfelu8Hermetyzacja
Konwencje nazewnictwaDomknięcia dla prywatnościDostęp za pomocą domknięćTabele tylko do odczytuLogika walidacjiPodsumowanie — bezpieczny sejf11Wzorce projektowe (podstawy)
Funkcje fabrykująceTabela SingletonWzorzec iteratoraObserwator (nasłuchujący)Powtórka — fabryka loggera3Stan i zachowanie obiektu
Zmienne instancjiMetody dostępoweMetody ustawiająceWłaściwości obliczaneFormatowanie ciągów znakówSprawdzanie równościPodsumowanie – ocena ucznia6Podstawy dziedziczenia
Konfiguracja dziedziczeniaDziedziczenie metodRozszerzanie konstruktoraDodawanie metod potomnychWspólne i unikalne elementyPowtórka — hierarchia kształtówPoćwicz samodzielnie: Kompilator Lua online