Kolekcja kształtów
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 59 z 70.
Wyzwanie
ŁatwyTeraz, gdy masz już w pełni funkcjonalne klasy Rectangle i Circle, utwórzmy klasę ShapeCollection, która może zarządzać wieloma kształtami jednocześnie. To świetny przykład kompozycji: kolekcja „ma” kształty, zamiast „być” kształtem.
Dodasz nowy plik do swojego rozbudowującego się projektu:
Shape.lua: Twoja bazowa klasa Shape (bez zmian).Rectangle.lua: Twoja klasa Rectangle z metodami:getArea()i:getPerimeter().Circle.lua: Twoja klasa Circle z metodami:getArea()i:getPerimeter().ShapeCollection.lua: Utwórz nową klasę, która przechowuje kształty wewnętrznie. Dodaj konstruktor:new(), który inicjalizuje pustą listę kształtów, metodę:addShape(shape), która dodaje dowolny kształt do kolekcji, oraz metodę:count(), która zwraca liczbę aktualnie przechowywanych kształtów.main.lua: Połącz wszystko, importując swoje moduły. Odczytaj wymiary z danych wejściowych, utwórz prostokąt i koło, dodaj oba do ShapeCollection, a następnie wypisz liczbę elementów kolekcji, a po niej nazwę każdego kształtu (w kolejności, w jakiej zostały dodane).
ShapeCollection nie musi wiedzieć, czy przechowuje prostokąty, czy koła. Po prostu przechowuje kształty. To pokazuje, jak polimorfizm pozwala jednolicie traktować różne typy obiektów za pomocą wspólnego interfejsu.
Dane wejściowe: Trzy wiersze: szerokość (liczba), wysokość (liczba) i promień (liczba).
Dane wyjściowe: Trzy wiersze: liczba kształtów w kolekcji, następnie nazwa pierwszego dodanego kształtu, a potem nazwa drugiego dodanego kształtu.
Spróbuj swoich sił
-- Załaduj moduł Rectangle
local Rectangle = require('Rectangle')
-- Załaduj moduł Circle
local Circle = require('Circle')
-- Załaduj moduł ShapeCollection
local ShapeCollection = require('ShapeCollection')
-- Odczytaj szerokość i wysokość z wejścia
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- Utwórz nową instancję Rectangle o podanych wymiarach
local rect = Rectangle:new(width, height)
-- Utwórz nową instancję Circle o podanym promieniu
local circ = Circle:new(radius)
-- Utwórz nową instancję ShapeCollection
local collection = ShapeCollection:new()
-- Dodaj obie figury do kolekcji
collection:addShape(rect)
collection:addShape(circ)
-- Wypisz liczbę figur w kolekcji
print(collection:count())
-- Wypisz nazwę każdej figury w kolejności ich dodawania
for i = 1, collection:count() do
print(collection.shapes[i]:getName())
end
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