Rückblick – Shape Calculator
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 49 von 110.
Aufgabe
EinfachLassen Sie uns ein Formberechnungssystem erstellen, das abstrakte Klassen und Schnittstellen kombiniert, um ein flexibles Geometrie-Toolkit zu schaffen. Sie werden eine Klassenhierarchie entwerfen, in der verschiedene Formen gemeinsames Verhalten durch Abstraktion teilen, während jede Form ihre eigenen einzigartigen Berechnungen bereitstellt.
Sie werden Ihren Code in drei Dateien organisieren:
shape.dart: Definieren Sie hier Ihre abstrakte Basisklasse und Schnittstelle:- Eine abstrakte Klasse
Shapemit einerString nameEigenschaft und einem Konstruktor. Fügen Sie die abstrakten Methodendouble calculateArea()unddouble calculatePerimeter()hinzu. Fügen Sie eine reguläre Methodedescribe()hinzu, die'$name - Area: ${calculateArea()}, Perimeter: ${calculatePerimeter()}'ausgibt. - Eine
DrawableKlasse mit einer Methodedraw(), die'Drawing shape...'ausgibt.
- Eine abstrakte Klasse
shapes.dart: Importieren Sieshape.dartund erstellen Sie Ihre konkreten Form-Klassen:- Eine
RectangleKlasse, dieShapeerweitert undDrawableimplementiert. Fügen Sie die Eigenschaftendouble widthunddouble heighthinzu. Berechnen Sie die Fläche alswidth * heightund den Umfang als2 * (width + height). Diedraw()Methode sollte'Drawing rectangle ${width}x$height'ausgeben. - Eine
CircleKlasse, dieShapeerweitert undDrawableimplementiert. Fügen Sie einedouble radiusEigenschaft hinzu. Verwenden Sie3.14159für Pi. Berechnen Sie die Fläche alspi * radius * radiusund den Umfang (Umfang) als2 * pi * radius. Diedraw()Methode sollte'Drawing circle with radius $radius'ausgeben.
- Eine
main.dart: Importieren Sieshapes.dartund demonstrieren Sie Ihr Formberechnungssystem:- Erstellen Sie ein
Rectanglenamens'Rectangle'mit der Breite5.0und der Höhe3.0. - Erstellen Sie einen
Circlenamens'Circle'mit dem Radius4.0. - Rufen Sie für jede Form zuerst
draw()und danndescribe()auf. - Geben Sie eine Leerzeile zwischen den beiden Formen aus.
- Erstellen Sie ein
Diese Herausforderung zeigt, wie abstrakte Klassen eine gemeinsame Struktur definieren (jede Form hat Flächen- und Umfangsberechnungen), während Schnittstellen zusätzliche Fähigkeiten hinzufügen (Formen, die gezeichnet werden können). Jede konkrete Klasse erweitert die abstrakte Klasse für ihre Kernidentität und implementiert die Schnittstelle für zusätzliche Funktionalität.
Erwartete Ausgabe:
Drawing rectangle 5.0x3.0
Rectangle - Area: 15.0, Perimeter: 16.0
Drawing circle with radius 4.0
Circle - Area: 50.26544, Perimeter: 25.13272Probier es selbst
import 'shapes.dart';
void main() {
// TODO: Erstelle ein Rechteck namens 'Rectangle' mit der Breite 5.0 und der Höhe 3.0
// TODO: Erstelle einen Kreis namens 'Circle' mit dem Radius 4.0
// TODO: Rufe für das Rechteck draw() und dann describe() auf
// TODO: Gib eine Leerzeile aus
// TODO: Rufe für den Kreis draw() und dann describe() auf
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor