Rückblick – Formrechner
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 25 von 65.
Aufgabe
MittelErstelle einen Formrechner, der echte Formen, ein formenähnliches Objekt außerhalb der Hierarchie und Objekte behandelt, die er nicht messen kann.
Shapeist abstrakt und besitzt die abstrakten Methodenarea() -> float,perimeter() -> floatundshape_name() -> String. Seine normale Methodedescribe()gibtNAME: area A, perimeter Pmit zwei Dezimalstellen zurück.Circle(radius),Rectangle(width,height) undTriangle(Seitena,b,c) erweiternShape. Ihre Namen sindCircle,RectangleundTriangle. Die Fläche eines Kreises istPI * r * rund sein Umfang2 * PI * r. Verwende für das Dreieck die Formel von Heron: Mits = (a + b + c) / 2beträgt die Flächesqrt(s * (s - a) * (s - b) * (s - c)).CustomShapeerweitertShapeNICHT. Es hat einencustom_nameund einesize;area()istsize * size,perimeter()ist4 * size, unddescribe()verwendet dasselbe Format wieShape, mit seinem benutzerdefinierten Namen.ShapeCalculatorbesitzt zwei statische Funktionen.process(thing)gibt[Shape]plusdescribe()für einShapezurück,[Duck]plusdescribe()für jedes andere Objekt, das einedescribe()-Methode besitzt, und andernfallsCannot measure this object.total_area(things)addiert diearea()aller Objekte, die einearea()-Methode besitzen.
Der bereitgestellte Code liest ein, wie viele Objekte folgen, und anschließend eines pro Zeile: circle R, rectangle W H, triangle A B C, custom NAME SIZE oder unknown (ein einfaches RefCounted-Objekt). Er gibt für jedes Objekt process() und die Gesamtfläche aus. Für circle 5, custom Hexa 3 und unknown gibt er Folgendes aus:
[Shape] Circle: area 78.54, perimeter 31.42
[Duck] Hexa: area 9.00, perimeter 12.00
Cannot measure this object
Total area: 87.54Dein Code gehört in shape.gd, circle.gd, rectangle.gd, triangle.gd, custom_shape.gd und shape_calculator.gd. main.gd enthält den bereitgestellten Ein- und Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Ein-/Ausgabecode: unverändert lassen
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))
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler