Aufrufbare Klassen
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 84 von 110.
In Dart kannst du Instanzen einer Klasse aufrufbar wie Funktionen machen, indem du die Methode call() implementierst. Dadurch kannst du ein Objekt mit der Aufrufsyntax für Funktionen verwenden – indem du direkt Klammern auf der Instanz verwendest.
class Multiplier {
final int factor;
Multiplier(this.factor);
int call(int value) {
return value * factor;
}
}
void main() {
var double = Multiplier(2);
var triple = Multiplier(3);
print(double(5)); // 10 - das Objekt wie eine Funktion aufrufen
print(triple(5)); // 15
}Wenn du double(5) schreibst, ruft Dart automatisch die Methode call() auf, wobei 5 als Argument übergeben wird. Das Objekt verhält sich wie eine Funktion und behält dennoch seinen Zustand (das Feld factor).
Die call()-Methode kann jede beliebige Signatur haben – mehrere Parameter, optionale Parameter oder sogar unterschiedliche Typen zurückgeben:
class Greeter {
final String greeting;
Greeter(this.greeting);
String call(String name, {String punctuation = '!'}) {
return '$greeting, $name$punctuation';
}
}
void main() {
var hello = Greeter('Hello');
print(hello('Alice')); // Hallo, Alice!
print(hello('Bob', punctuation: '.')); // Hallo, Bob.
}Aufrufbare Klassen sind nützlich, wenn du funktionsähnliches Verhalten mit Zustand oder Konfiguration kombinieren musst. Sie werden häufig verwendet, um wiederverwendbare Operationen, Validierer oder Transformationen zu erstellen, die sich Einstellungen zwischen Aufrufen merken müssen.
Aufgabe
EinfachErstelle ein Textformatierungssystem mit aufrufbaren Klassen! Du erstellst Objekte, die wie Funktionen aufgerufen werden können, um Text auf verschiedene Weise umzuwandeln, während sie ihre eigenen Konfigurationseinstellungen beibehalten.
Du organisierst deinen Code in zwei Dateien:
formatters.dart: Erstelle zwei aufrufbare Klassen, die Text umwandeln:- Eine
Wrapper-Klasse, die Text mit einem Präfix und einem Suffix umschließt. Sie soll einenString prefixund einenString suffixspeichern und bei einem Aufruf mit einemString text-Parameter den Text zwischen dem Präfix und dem Suffix zurückgeben. - Eine
Repeater-Klasse, die Text eine bestimmte Anzahl von Malen wiederholt. Sie soll einenint times-Wert speichern und bei einem Aufruf mit einemString text-Parameter den Text so oft wiedergeben, mit einem Leerzeichen zwischen jeder Wiederholung.
- Eine
main.dart: Importiere deine Formatierer und zeige, wie aufrufbare Klassen funktionieren:- Erstelle einen
Wrappermit dem Präfix"["und dem Suffix"]" - Erstelle einen weiteren
Wrappermit dem Präfix"***"und dem Suffix"***" - Erstelle einen
Repeater, der 3-mal wiederholt - Rufe den ersten Wrapper mit
"Hello"auf und gib das Ergebnis aus - Rufe den zweiten Wrapper mit
"Important"auf und gib das Ergebnis aus - Rufe den Repeater mit
"Go"auf und gib das Ergebnis aus - Führe sie schließlich zusammen: Rufe den ersten Wrapper mit dem Ergebnis des Aufrufs des Repeaters mit
"Dart"auf und gib das Ergebnis aus
- Erstelle einen
Beachte, wie sich jedes Formatiererobjekt seine Konfiguration merkt und direkt mit Klammern aufgerufen werden kann, genau wie eine Funktion!
Erwartete Ausgabe:
[Hello]
***Important***
Go Go Go
[Dart Dart Dart]Probier es selbst
import 'formatters.dart';
void main() {
// TODO: Erstelle einen Wrapper mit Präfix "[" und Suffix "]"
// TODO: Erstelle einen weiteren Wrapper mit Präfix "***" und Suffix "***"
// TODO: Erstelle einen Repeater, der 3 Mal wiederholt
// TODO: Rufe den ersten Wrapper mit "Hello" auf und gib das Ergebnis aus
// TODO: Rufe den zweiten Wrapper mit "Important" auf und gib das Ergebnis aus
// TODO: Rufe den Repeater mit "Go" auf und gib das Ergebnis aus
// TODO: Kombiniere sie: rufe den ersten Wrapper mit dem Ergebnis von
// dem Aufruf des Repeaters mit "Dart" auf und gib das Ergebnis aus
}
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