Initialisierungslisten
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 12 von 110.
Eine Initialisierungsliste ist der Code, der nach einem Doppelpunkt in einem Konstruktor und vor dem Konstruktorrumpf erscheint. Sie wird ausgeführt, bevor der Konstruktorrumpf ausgeführt wird, und wird verwendet, um Instanzvariablen zu initialisieren.
Du hast Initialisierungslisten bereits in früheren Lektionen gesehen:
Point.origin() : x = 0, y = 0;Der Teil nach dem Doppelpunkt (x = 0, y = 0) ist die Initialisierungsliste. Mehrere Initialisierungen werden durch Kommas getrennt.
Initialisierungslisten sind essenziell bei der Arbeit mit final-Variablen, die gesetzt werden müssen, bevor der Konstruktor-Rumpf ausgeführt wird:
class Circle {
final double radius;
final double area;
Circle(double r)
: radius = r,
area = 3.14159 * r * r;
}
Circle c = Circle(5);
print(c.radius); // 5.0
print(c.area); // 78.53975Die Initialisierungsliste kann auch Berechnungen oder Transformationen an Konstruktorparametern durchführen, bevor diese zugewiesen werden. Dies ist nützlich, wenn Sie Werte ableiten oder Daten während der Objekterstellung validieren müssen.
Sie können die Kurzschreibweise this. mit einer Initialisierungsliste kombinieren:
class Rectangle {
final double width;
final double height;
final double area;
Rectangle(this.width, this.height)
: area = width * height;
}
Rectangle rect = Rectangle(4, 5);
print(rect.area); // 20.0Hier werden width und height per Kurzschreibweise zugewiesen, während area in der Initialisierungsliste unter Verwendung dieser Werte berechnet wird.
Aufgabe
EinfachErstelle einen Box-Maßrechner, der Initialisierungslisten verwendet, um abgeleitete Werte zu berechnen, wenn Objekte erstellt werden.
Organisiere deinen Code in zwei Dateien:
box.dart: Definiere eineBox-Klasse, die eine 3D-Box mit Abmessungen und automatisch berechneten Eigenschaften darstellt. Deine Klasse sollte Folgendes enthalten:- Drei
final double-Felder:length,widthundheight - Zwei berechnete
final double-Felder:volumeundsurfaceArea - Einen Konstruktor, der
length,widthundheightmithilfe der Kurzschreibweisethis.übernimmt und eine Initialisierungsliste verwendet, umvolume(length × width × height) undsurfaceArea(2 × (length×width + width×height + height×length)) zu berechnen - Eine
display()-Methode, die die Informationen zur Box ausgibt
- Drei
main.dart: Importiere deine Box-Klasse und erstelle zwei Boxen:- Eine Box mit den Abmessungen
3.0,4.0,5.0 - Eine Box mit den Abmessungen
2.0,2.0,2.0
display()in der aufgeführten Reihenfolge auf.- Eine Box mit den Abmessungen
Die display()-Methode sollte in diesem exakten Format ausgeben:
Box: [length]x[width]x[height] | Volume: [volume] | Surface: [surfaceArea]Erwartete Ausgabe:
Box: 3.0x4.0x5.0 | Volume: 60.0 | Surface: 94.0
Box: 2.0x2.0x2.0 | Volume: 8.0 | Surface: 24.0Probier es selbst
import 'box.dart';
void main() {
// TODO: Erstelle eine Box mit den Maßen 3.0, 4.0, 5.0
// TODO: Erstelle eine Box mit den Maßen 2.0, 2.0, 2.0
// TODO: Rufe display() für jede Box der Reihe nach 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 Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler