Pole całkowite
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 60 z 70.
Wyzwanie
ŁatwyDodajmy do Twojego ShapeCollection przydatną funkcję: możliwość obliczania łącznego pola wszystkich zawartych w nim figur. Właśnie tutaj polimorfizm pokazuje swoją siłę: Twoja kolekcja może wywołać :getArea() na dowolnej figurze, nie wiedząc, czy jest to prostokąt, czy koło.
Kontynuujesz pracę nad istniejącymi plikami projektu:
Shape.lua: Twoja podstawowa 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: Rozszerz swoją klasę kolekcji, dodając metodę:getTotalArea(). Metoda ta powinna przejść przez wszystkie przechowywane figury, wywołać na każdej z nich:getArea()i zwrócić sumę wszystkich pól.main.lua: Wczytaj swoje moduły, odczytaj wymiary z danych wejściowych, utwórz prostokąt i koło, dodaj obie figury do ShapeCollection, a następnie wypisz łączne pole wszystkich figur w kolekcji.
Zaletą tego podejścia jest to, że :getTotalArea() nie potrzebuje osobnej logiki dla prostokątów i kół. Po prostu zakłada, że każda figura w kolekcji ma metodę :getArea(). Później możesz dodać trójkąty, sześciokąty lub dowolne inne figury, a obliczanie łącznego pola będzie działać bez zmian.
Dane wejściowe: Trzy wiersze: szerokość (liczba), wysokość (liczba) i promień (liczba).
Wynik: Jeden wiersz zawierający łączne pole wszystkich figur w kolekcji.
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 danych wejściowych
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)
-- Wyświetl łączne pole wszystkich figur w kolekcji
print(collection:getTotalArea())
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