Menu
Coddy logo textTech

Callable Classes

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 84 von 110.

In Dart können Sie Instanzen einer Klasse wie Funktionen aufrufbar machen, indem Sie die call()-Methode implementieren. Dies ermöglicht es Ihnen, ein Objekt mit der Funktionsaufrufsyntax zu verwenden – also Klammern direkt auf der Instanz anzuwenden.

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 Sie double(5) schreiben, ruft Dart automatisch die call()-Methode mit 5 als Argument auf. Das Objekt verhält sich wie eine Funktion, während es gleichzeitig seinen Zustand (das factor-Feld) beibehält.

Die call()-Methode kann jede beliebige Signatur haben – mehrere Parameter, optionale Parameter oder sogar verschiedene 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 Sie funktionsähnliches Verhalten in Kombination mit Zustand oder Konfiguration benötigen. Sie werden häufig zur Erstellung von wiederverwendbaren Operationen, Validatoren oder Transformationen verwendet, die sich Einstellungen zwischen den Aufrufen merken müssen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Textformatierungssystem mit aufrufbaren Klassen (callable classes) erstellen! Sie werden Objekte erstellen, die wie Funktionen aufgerufen werden können, um Text auf verschiedene Weise zu transformieren, während sie ihre eigenen Konfigurationseinstellungen beibehalten.

Sie werden Ihren Code in zwei Dateien organisieren:

  • formatters.dart: Erstellen Sie zwei aufrufbare Klassen, die Text transformieren:
    • Eine Wrapper-Klasse, die Text mit einem Präfix und einem Suffix umschließt. Sie sollte einen String prefix und einen String suffix speichern und, wenn sie mit einem String text-Parameter aufgerufen wird, den zwischen Präfix und Suffix eingeschlossenen Text zurückgeben.
    • Eine Repeater-Klasse, die Text eine bestimmte Anzahl von Malen wiederholt. Sie sollte einen int times-Wert speichern und, wenn sie mit einem String text-Parameter aufgerufen wird, den Text so oft wiederholt zurückgeben, mit einem Leerzeichen zwischen jeder Wiederholung.
  • main.dart: Importieren Sie Ihre Formatierer und demonstrieren Sie, wie aufrufbare Klassen funktionieren:
    • Erstellen Sie einen Wrapper mit dem Präfix "[" und dem Suffix "]"
    • Erstellen Sie einen weiteren Wrapper mit dem Präfix "***" und dem Suffix "***"
    • Erstellen Sie einen Repeater, der 3 Mal wiederholt
    • Rufen Sie den ersten Wrapper mit "Hello" auf und geben Sie das Ergebnis aus
    • Rufen Sie den zweiten Wrapper mit "Important" auf und geben Sie das Ergebnis aus
    • Rufen Sie den Repeater mit "Go" auf und geben Sie das Ergebnis aus
    • Kombinieren Sie sie schließlich: Rufen Sie den ersten Wrapper mit dem Ergebnis des Aufrufs des Repeaters mit "Dart" auf und geben Sie das Ergebnis aus

Beachten Sie, wie sich jedes Formatierer-Objekt an seine Konfiguration erinnert und direkt mit Klammern aufgerufen werden kann, genau wie eine Funktion!

Erwartete Ausgabe:

[Hello]
***Important***
Go Go Go
[Dart Dart Dart]

Spickzettel

Klassen können wie Funktionen aufrufbar gemacht werden, indem die Methode call() implementiert wird:

class Multiplier {
  final int factor;
  
  Multiplier(this.factor);
  
  int call(int value) {
    return value * factor;
  }
}

void main() {
  var double = Multiplier(2);
  print(double(5));   // 10 - Aufruf des Objekts wie eine Funktion
}

Die Methode call() kann jede beliebige Signatur mit mehreren Parametern, optionalen Parametern oder verschiedenen Rückgabetypen haben:

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'));              // Hello, Alice!
  print(hello('Bob', punctuation: '.')); // Hello, Bob.
}

Aufrufbare Klassen sind nützlich, um funktionsähnliches Verhalten kombiniert mit Status oder Konfiguration zu erstellen.

Probier es selbst

import 'formatters.dart';

void main() {
  // TODO: Erstelle einen Wrapper mit dem Präfix "[" und dem Suffix "]"
  
  // TODO: Erstelle einen weiteren Wrapper mit dem Präfix "***" und dem 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 des
  // Aufrufs des Repeaters mit "Dart" auf und gib das Ergebnis aus
  
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung