Erweiterungsmethoden
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 83 von 110.
Manchmal möchtest du einer Klasse, die dir nicht gehört, Funktionalität hinzufügen – etwa Darts integrierten Typen String oder int. Du kannst ihren Quellcode nicht ändern, und Vererbung hilft bei finalen Klassen nicht weiter. Hier kommen Erweiterungsmethoden ins Spiel.
Erweiterungen ermöglichen es dir, neue Methoden zu vorhandenen Typen hinzuzufügen, ohne sie zu ändern oder Unterklassen zu erstellen:
extension StringExtras on String {
String reverse() {
return split('').reversed.join('');
}
bool get isPalindrome {
var cleaned = toLowerCase().replaceAll(' ', '');
return cleaned == cleaned.split('').reversed.join('');
}
}
void main() {
print('hello'.reverse()); // olleh
print('radar'.isPalindrome); // true
}Die Syntax lautet extension ExtensionName on Type. Darin definieren Sie Methoden und Getter genau wie in einer regulären Klasse. Einmal definiert, erscheinen diese Methoden auf allen Instanzen dieses Typs, als wären sie integriert.
Erweiterungen funktionieren für jeden Typ, einschließlich eigener Klassen und generischer Typen:
extension IntExtras on int {
int squared() => this * this;
}
extension ListExtras<T> on List<T> {
T? get secondOrNull => length >= 2 ? this[1] : null;
}
void main() {
print(5.squared()); // 25
print([1, 2, 3].secondOrNull); // 2
}Beachten Sie, dass innerhalb einer Erweiterung this auf die Instanz verweist, auf der die Methode aufgerufen wird. Erweiterungen sind eine saubere Möglichkeit, bestehende Typen zu verbessern und gleichzeitig Ihren Code organisiert und lesbar zu halten.
Aufgabe
EinfachErweitere Darts integrierte Typen mit nützlichen Funktionen mithilfe von Erweiterungsmethoden! Du wirst Erweiterungen erstellen, die den Typen String und List hilfreiche Methoden hinzufügen, und sie anschließend in deiner Hauptdatei verwenden.
Du wirst deinen Code auf zwei Dateien aufteilen:
extensions.dart: Erstelle zwei Erweiterungen, die bestehenden Typen neue Funktionen hinzufügen:- Eine Erweiterung namens
StringUtilsfürStringmit:- Eine Methode
countVowels(), die die Anzahl der Vokale (a, e, i, o, u – unabhängig von der Groß- und Kleinschreibung) im String zurückgibt - Einen Getter
initials, der den ersten Buchstaben jedes Wortes (durch Leerzeichen getrennt) zurückgibt, zusammengefügt und in Großbuchstaben umgewandelt. Zum Beispiel wird"hello world"zu"HW"
- Eine Methode
- Eine Erweiterung namens
ListUtils<T>fürList<T>mit:- Eine Methode
safeGet(int index), die das Element am Index zurückgibt, wenn es existiert, odernull, wenn der Index außerhalb des gültigen Bereichs liegt - Einen Getter
hasMultiple, dertruezurückgibt, wenn die Liste mehr als ein Element enthält
- Eine Methode
- Eine Erweiterung namens
main.dart: Importiere deine Erweiterungen und führe sie praktisch vor:- Erstelle den String
"Object Oriented Programming"und gib seine Anzahl an Vokalen im FormatVowels: [count]aus - Gib die Initialen desselben Strings im Format
Initials: [initials]aus - Erstelle eine Liste von Ganzzahlen
[10, 20, 30] - Gib das Ergebnis von
safeGet(1)im FormatElement at 1: [value]aus - Gib das Ergebnis von
safeGet(5)im FormatElement at 5: [value]aus - Gib aus, ob die Liste mehrere Elemente enthält, im Format
Has multiple: [true/false]
- Erstelle den String
Denke daran, dass sich innerhalb einer Erweiterung this auf die Instanz bezieht, für die die Methode aufgerufen wird. Deine Erweiterungen lassen diese Typen so wirken, als hätten sie diese Methoden bereits integriert!
Erwartete Ausgabe:
Vowels: 9
Initials: OOP
Element at 1: 20
Element at 5: null
Has multiple: trueProbier es selbst
import 'extensions.dart';
void main() {
// Erstelle den String
String text = "Object Oriented Programming";
// TODO: Gib die Anzahl der Vokale mit countVowels() aus
// Format: Vowels: [count]
// TODO: Gib die Initialen mit dem initials Getter aus
// Format: Initials: [initials]
// Erstelle die Liste von Ganzzahlen
List<int> numbers = [10, 20, 30];
// TODO: Gib das Ergebnis von safeGet(1) aus
// Format: Element at 1: [value]
// TODO: Gib das Ergebnis von safeGet(5) aus
// Format: Element at 5: [value]
// TODO: Gib aus, ob die Liste mehrere Elemente hat
// Format: Has multiple: [true/false]
}
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