Końcowy sprawdzian z OOP
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 70 z 70.
Wyzwanie
ŁatwyZbierzmy w całość wszystko, czego nauczysz się o OOP w Lua! Zbudujesz system pojazdów, który demonstruje dziedziczenie, enkapsulację za pomocą konwencji nazewniczych oraz miksy dodające opcjonalne możliwości.
Rozmieścisz swój kod w pięciu plikach:
Vehicle.lua: Klasa bazowa dla wszystkich pojazdów. Każdy pojazd manameoraz_speed, który zgodnie z konwencją jest prywatny (zainicjalizowany wartością 0). Dodaj metodę odczytującą:getName(), metodę odczytującą:getSpeed()oraz metodę ustawiającą:setSpeed(value), która odrzuca wartości ujemne (jeśli wartość jest ujemna, wypiszSpeed cannot be negativei nie zmieniaj wartości). Dodaj metodę:describe(), która zwraca"{name} moving at {speed}".Refuelable.lua: Tabela miksu zawierająca zachowanie związane z paliwem. Dodaj metodę:refuel(amount), która zwiększa wartośćself._fuel, oraz metodę:getFuel(), która zwraca aktualny poziom paliwa.Car.lua: Dziedziczy po Vehicle i używa miksu Refuelable. Konstruktor przyjmujenamei inicjalizuje_fuelwartością 0. Zastąp metodę:describe(), aby zwracała"{name} moving at {speed}, fuel: {fuel}". Zastosuj miks Refuelable, aby samochody mogły korzystać z paliwa.Bicycle.lua: Dziedziczy wyłącznie po Vehicle — nie potrzebuje obsługi paliwa. Konstruktor przyjmuje tylkoname. Rowery używają odziedziczonej metody:describe()bez modyfikacji.main.lua: Zbierzmy wszystko w całość! Utwórz samochód i rower na podstawie danych wejściowych, zademonstruj ich różne możliwości i pokaż, jak współdzielą typowe zachowania pojazdów, a jednocześnie mają odrębne cechy.
Otrzymasz cztery dane wejściowe:
- Nazwa samochodu
- Nazwa roweru
- Prędkość do ustawienia dla obu pojazdów (liczba)
- Ilość paliwa do dolania do samochodu (liczba)
W pliku głównym:
- Utwórz samochód i rower o podanych nazwach
- Ustaw prędkość obu pojazdów, używając trzeciej wartości wejściowej
- Dolej paliwa do samochodu, używając czwartej wartości wejściowej
- Wypisz opis samochodu
- Wypisz opis roweru
Na przykład, jeśli danymi wejściowymi są Sedan, Mountain Bike, 60 i 45, wynikiem powinno być:
Sedan moving at 60, fuel: 45
Mountain Bike moving at 60Jeśli danymi wejściowymi są Sports Car, Road Bike, 120 i 80, wynikiem powinno być:
Sports Car moving at 120, fuel: 80
Road Bike moving at 120To wyzwanie pokazuje, jak dziedziczenie zapewnia wspólne zachowanie (oba pojazdy mogą się poruszać), miksy dodają opcjonalne możliwości (tylko samochody potrzebują paliwa), a enkapsulacja chroni integralność danych (walidacja prędkości). Każda technika pełni w Twoim projekcie inną funkcję!
Spróbuj swoich sił
-- main.lua: Połącz wszystko w całość
local Car = require('Car')
local Bicycle = require('Bicycle')
-- Wczytaj dane wejściowe
local carName = io.read()
local bicycleName = io.read()
local speed = tonumber(io.read())
local fuelAmount = tonumber(io.read())
-- TODO: Utwórz samochód o podanej nazwie
-- TODO: Utwórz rower o podanej nazwie
-- TODO: Ustaw prędkość obu pojazdów
-- TODO: Zatankuj samochód podaną ilością paliwa
-- TODO: Wypisz opis samochodu
-- TODO: Wypisz opis roweru
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ów9Kompozycja i mixiny
Relacja Has-ADelegowanieProste mixinyStosowanie wielu mixinówMixiny a dziedziczeniePodsumowanie — składanie robota12Końcowe wyzwania
Powtórka — system magazynowyPowtórka — menedżer użytkownikówPowtórka — śledzenie wynikówKońcowy sprawdzian z OOPPoćwicz samodzielnie: Kompilator Lua online