Powtórzenie – kalkulator kształtów
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 25 z 65.
Wyzwanie
ŚredniZbuduj kalkulator kształtów, który obsługuje rzeczywiste kształty, obiekt podobny do kształtu spoza hierarchii oraz obiekty, których nie potrafi zmierzyć.
Shapejest klasą abstrakcyjną z abstrakcyjnymi metodamiarea() -> float,perimeter() -> floatishape_name() -> String. Jego zwykła metodadescribe()zwracaNAME: area A, perimeter Pz dokładnością do dwóch miejsc po przecinku.Circle(radius),Rectangle(width,height) iTriangle(bokia,b,c) rozszerzająShape. Ich nazwy toCircle,RectangleiTriangle. Pole koła toPI * r * r, a jego obwód to2 * PI * r. W przypadku trójkąta użyj wzoru Herona: dlas = (a + b + c) / 2pole wynosisqrt(s * (s - a) * (s - b) * (s - c)).CustomShapeNIE rozszerzaShape. Macustom_nameisize;area()wynosisize * size,perimeter()wynosi4 * size, adescribe()używa tego samego formatu coShape, z własną nazwą.ShapeCalculatorma dwie funkcje statyczne.process(thing)zwraca[Shape]oraz wynikdescribe()dla obiektuShape,[Duck]oraz wynikdescribe()dla każdego innego obiektu, który ma metodędescribe(), a w pozostałych przypadkachCannot measure this object.total_area(things)sumuje wynikiarea()wszystkich obiektów, które mają metodęarea().
Dostarczony kod odczytuje liczbę kolejnych obiektów, a następnie po jednym w każdym wierszu: circle R, rectangle W H, triangle A B C, custom NAME SIZE lub unknown (zwykły obiekt RefCounted). Wypisuje wynik process() dla każdego obiektu oraz łączne pole. Dla circle 5, custom Hexa 3 i unknown wypisuje:
[Shape] Circle: area 78.54, perimeter 31.42
[Duck] Hexa: area 9.00, perimeter 12.00
Cannot measure this object
Total area: 87.54Umieść swój kod w plikach shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd i shape_calculator.gd. main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
var count := int(OS.read_string_from_stdin())
var things := []
for i in count:
var p := OS.read_string_from_stdin().split(" ")
if p[0] == "circle":
things.append(Circle.new(float(p[1])))
elif p[0] == "rectangle":
things.append(Rectangle.new(float(p[1]), float(p[2])))
elif p[0] == "triangle":
things.append(Triangle.new(float(p[1]), float(p[2]), float(p[3])))
elif p[0] == "custom":
things.append(CustomShape.new(p[1], float(p[2])))
else:
things.append(RefCounted.new())
for thing in things:
print(ShapeCalculator.process(thing))
print("Total area: %.2f" % ShapeCalculator.total_area(things))
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online