Menu
Coddy logo textTech

call()-Methode

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

Dart hat eine spezielle Methode namens call(), mit der Sie ein Objekt so verwenden können, als wäre es eine Funktion. Wenn eine Klasse eine call()-Methode definiert, können Sie Instanzen dieser Klasse unter Verwendung der Funktionsaufrufsyntax aufrufen.

class Multiplier {
  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 - Objekt wie eine Funktion aufrufen
  print(triple(5));  // 15
}

Anstatt double.call(5) zu schreiben, kannst du einfach double(5) schreiben. Dart ruft automatisch die call()-Methode auf, wenn du Klammern für das Objekt verwendest.

Die call()-Methode kann beliebige Parameter akzeptieren und jeden Typ zurückgeben, genau wie eine reguläre Methode:

class Greeter {
  String prefix;
  
  Greeter(this.prefix);
  
  String call(String name, {String punctuation = '!'}) {
    return '$prefix, $name$punctuation';
  }
}

void main() {
  var hello = Greeter('Hello');
  print(hello('Alice'));  // Hello, Alice!
  print(hello('Bob', punctuation: '?'));  // Hello, Bob?
}

Dieses Muster ist nützlich, wenn Sie Objekte benötigen, die sich wie Funktionen verhalten, aber auch einen Zustand oder eine Konfiguration beibehalten. Es wird häufig zur Erstellung von wiederverwendbaren Operationen, Validatoren oder Formatierern verwendet, die sich Einstellungen zwischen Aufrufen merken müssen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Textformatierungssystem erstellen, bei dem Formatierungsobjekte direkt wie Funktionen aufgerufen werden können! Sie werden aufrufbare Klassen erstellen, die Text auf verschiedene Arten transformieren und dabei ihre Konfigurationseinstellungen beibehalten.

Sie werden Ihren Code in zwei Dateien organisieren:

  • formatters.dart: Erstellen Sie zwei aufrufbare Klassen, die Strings transformieren:
    • Eine Wrapper-Klasse, die Text mit einem konfigurierbaren Präfix und Suffix umschließt. Sie sollte prefix- und suffix-Strings speichern, und ihre call()-Methode sollte einen String text akzeptieren und den mit dem Präfix und Suffix umschlossenen Text zurückgeben.
    • Eine Repeater-Klasse, die Text eine konfigurierbare Anzahl von Malen wiederholt. Sie sollte eine times-Ganzzahl speichern, und ihre call()-Methode sollte einen String text akzeptieren und den Text so oft wiederholt zurückgeben, getrennt durch Leerzeichen.
  • main.dart: Importieren Sie Ihre Formatierer und demonstrieren Sie, wie diese Objekte genau wie Funktionen verwendet werden können:
    • 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, bei dem times auf 3 gesetzt ist
    • 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
    • Demonstrieren Sie die Verkettung, indem Sie das Ergebnis des ersten Wrappers (mit 'Nested') an den zweiten Wrapper übergeben und das Ergebnis ausgeben

Beachten Sie, wie Sie Ihre Formatierungsobjekte direkt mit Klammern aufrufen können, genau wie reguläre Funktionen. Die call()-Methode macht dies möglich, und jedes Objekt merkt sich seine Konfiguration zwischen den Anwendungen!

Erwartete Ausgabe:

[Hello]
***Important***
Go Go Go
***[Nested]***

Spickzettel

Die Methode call() ermöglicht es Ihnen, ein Objekt so zu verwenden, als wäre es eine Funktion. Wenn eine Klasse eine call()-Methode definiert, können Sie Instanzen dieser Klasse mit der Funktionsaufrufsyntax aufrufen.

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

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

Anstatt double.call(5) zu schreiben, können Sie einfach double(5) schreiben. Dart ruft automatisch die Methode call() auf, wenn Sie Klammern für das Objekt verwenden.

Die Methode call() kann beliebige Parameter akzeptieren und jeden Typ zurückgeben:

class Greeter {
  String prefix;
  
  Greeter(this.prefix);
  
  String call(String name, {String punctuation = '!'}) {
    return '$prefix, $name$punctuation';
  }
}

void main() {
  var hello = Greeter('Hello');
  print(hello('Alice'));  // Hello, Alice!
  print(hello('Bob', punctuation: '?'));  // Hello, Bob?
}

Dieses Muster ist nützlich, um Objekte zu erstellen, die sich wie Funktionen verhalten, aber auch einen Zustand oder eine Konfiguration zwischen den Aufrufen beibehalten.

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, bei dem times auf 3 gesetzt ist
  
  // 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: Demonstriere die Verkettung, indem du das Ergebnis des ersten Wrappers
  // (mit 'Nested') an den zweiten Wrapper übergibst und das Ergebnis ausgibst
}
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