Powtórka — hierarchia kształtów
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 36 z 70.
Wyzwanie
ŁatwyZbudujmy od podstaw kompletną hierarchię kształtów! Utworzysz klasę nadrzędną Shape, po której będą dziedziczyć wszystkie kształty, a następnie zbudujesz klasy potomne Circle i Square, z których każda będzie miała własne, unikalne właściwości, a jednocześnie będzie współdzielić wspólną funkcjonalność.
Rozmieścisz swój kod w czterech plikach:
Shape.lua: Klasa bazowa, po której będą dziedziczyć wszystkie kształty. Powinna mieć konstruktor:new(color), który przechowuje kolor kształtu, oraz metodę:getColor(), która go zwraca. Dzięki tej wspólnej właściwości każdy kształt, zarówno koło, jak i kwadrat, będzie miał kolor.Circle.lua: Klasa potomna dziedzicząca po Shape. Jej konstruktor:new(color, radius)powinien wywołać konstruktor klasy nadrzędnej, aby ustawić kolor, a następnie dodać promień jako unikalny atrybut. Dodaj metodę:describe(), która wypisuje szczegóły koła.Square.lua: Kolejna klasa potomna dziedzicząca po Shape. Jej konstruktor:new(color, side)również powinien wywołać konstruktor klasy nadrzędnej, a następnie zapisać długość boku. Dodaj także metodę:describe()dla kwadratów.main.lua: Połącz wszystko w całość, tworząc instancje obu kształtów i demonstrując, że poprawnie dziedziczą po Shape, zachowując jednocześnie swoje unikalne właściwości.
Otrzymasz dwa dane wejściowe:
- Dane koła: kolor i promień oddzielone przecinkiem (np.
blue,5) - Dane kwadratu: kolor i długość boku oddzielone przecinkiem (np.
red,4)
W pliku głównym utwórz koło i kwadrat z podanymi wartościami. Następnie wypisz poniższe elementy, każdy w osobnym wierszu:
- Wywołaj
:describe()dla koła - Wywołaj
:describe()dla kwadratu - Wypisz kolor koła za pomocą
:getColor() - Wypisz kolor kwadratu za pomocą
:getColor()
Metoda :describe() dla Circle powinna wypisywać:
Circle with radius {radius}Metoda :describe() dla Square powinna wypisywać:
Square with side {side}Na przykład, jeśli dane wejściowe to blue,5 i red,4, wynikiem powinno być:
Circle with radius 5
Square with side 4
blue
redTo demonstruje kompletny wzorzec dziedziczenia: oba kształty dziedziczą :getColor() z Shape (nigdy nie definiują jej samodzielnie), a każdy z nich ma własny unikalny atrybut i metodę :describe()!
Spróbuj swoich sił
-- main.lua: Połącz wszystko w całość
local Circle = require('Circle')
local Square = require('Square')
-- Odczytaj dane wejściowe dla koła (color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)
-- Odczytaj dane wejściowe dla kwadratu (color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)
-- TODO: Utwórz instancję Circle o podanym kolorze i promieniu
-- TODO: Utwórz instancję Square o podanym kolorze i długości boku
-- TODO: Wywołaj :describe() dla koła
-- TODO: Wywołaj :describe() dla kwadratu
-- TODO: Wypisz kolor koła za pomocą :getColor()
-- TODO: Wypisz kolor kwadratu za pomocą :getColor()
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