Benannte Konstruktoren
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 11 von 110.
Benannte Konstruktoren ermöglichen es Ihnen, mehrere Konstruktoren für eine Klasse zu erstellen, jeder mit einem beschreibenden Namen, der seinen Zweck verdeutlicht. Dies ist besonders nützlich, wenn Sie verschiedene Möglichkeiten benötigen, um ein Objekt zu initialisieren.
Die Syntax verwendet den Klassennamen, gefolgt von einem Punkt und dem Konstruktornamen:
class Point {
int x;
int y;
// Regulärer Konstruktor
Point(this.x, this.y);
// Benannter Konstruktor für den Ursprungspunkt
Point.origin() : x = 0, y = 0;
// Benannter Konstruktor aus einem einzelnen Wert
Point.diagonal(int value) : x = value, y = value;
}Jeder benannte Konstruktor bietet eine klare, lesbare Möglichkeit, Objekte zu erstellen:
Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.diagonal(10);
print('p1: (${p1.x}, ${p1.y})'); // p1: (3, 5)
print('p2: (${p2.x}, ${p2.y})'); // p2: (0, 0)
print('p3: (${p3.x}, ${p3.y})'); // p3: (10, 10)Benannte Konstruktoren machen Ihren Code ausdrucksstärker. Anstatt zu raten, was Point(0, 0) bedeutet, kommuniziert Point.origin() sofort die Absicht. Dieses Muster ist in Dart-Bibliotheken weit verbreitet und hilft dabei, selbstdokumentierenden Code zu erstellen.
Aufgabe
EinfachLassen Sie uns einen Temperaturkonverter bauen, der die Leistungsfähigkeit von benannten Konstruktoren (Named Constructors) demonstriert. Sie werden eine Temperature-Klasse erstellen, die auf verschiedene Arten initialisiert werden kann, je nachdem, mit welcher Einheit Sie beginnen.
Sie werden Ihren Code in zwei Dateien organisieren:
temperature.dart: Definieren Sie eineTemperature-Klasse mit einerdouble celsiusInstanzvariable. Ihre Klasse sollte drei Möglichkeiten bieten, eine Temperatur zu erstellen:- Einen regulären Konstruktor
Temperature(this.celsius), der einen Celsius-Wert direkt entgegennimmt - Einen benannten Konstruktor
Temperature.fromFahrenheit, der einen Fahrenheit-Wert akzeptiert und ihn mit der Formel(fahrenheit - 32) * 5 / 9in Celsius umrechnet - Einen benannten Konstruktor
Temperature.freezing(), der eine Temperatur am Gefrierpunkt (0 Grad Celsius) erstellt
display()-Methode hinzu, die Folgendes ausgibt:[celsius]C- Einen regulären Konstruktor
main.dart: Importieren Sie Ihre Temperatur-Klasse und erstellen Sie drei Temperatur-Objekte:- Eines unter Verwendung des regulären Konstruktors mit
25.0 - Eines unter Verwendung von
fromFahrenheitmit98.6 - Eines unter Verwendung von
freezing()
display()für jede Temperatur in der oben aufgeführten Reihenfolge auf.- Eines unter Verwendung des regulären Konstruktors mit
Erwartetes Ausgabeformat:
25.0C
37.0C
0.0CSpickzettel
Benannte Konstruktoren ermöglichen es Ihnen, mehrere Konstruktoren für eine Klasse mit beschreibenden Namen zu erstellen, die ihren Zweck verdeutlichen.
Die Syntax verwendet den Klassennamen gefolgt von einem Punkt und dem Konstruktornamen:
class Point {
int x;
int y;
// Regulärer Konstruktor
Point(this.x, this.y);
// Benannter Konstruktor für den Ursprungspunkt
Point.origin() : x = 0, y = 0;
// Benannter Konstruktor aus einem einzelnen Wert
Point.diagonal(int value) : x = value, y = value;
}Verwendung von benannten Konstruktoren:
Point p1 = Point(3, 5);
Point p2 = Point.origin();
Point p3 = Point.diagonal(10);
print('p1: (${p1.x}, ${p1.y})'); // p1: (3, 5)
print('p2: (${p2.x}, ${p2.y})'); // p2: (0, 0)
print('p3: (${p3.x}, ${p3.y})'); // p3: (10, 10)Benannte Konstruktoren machen den Code ausdrucksstärker und selbstdokumentierend, indem sie die Absicht klar kommunizieren.
Probier es selbst
import 'temperature.dart';
void main() {
// TODO: Erstelle eine Temperature mit dem regulären Konstruktor mit 25.0
// TODO: Erstelle eine Temperature mit fromFahrenheit mit 98.6
// TODO: Erstelle eine Temperature mit freezing()
// TODO: Rufe display() für jede Temperatur in der richtigen Reihenfolge auf
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
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