Menu
Coddy logo textTech

Metoda call()

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 73 z 110.

Dart ma specjalną metodę o nazwie call(), która pozwala używać obiektu tak, jakby był funkcją. Gdy klasa definiuje metodę call(), możesz wywoływać jej instancje, używając składni wywołania funkcji.

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 - wywołanie obiektu jak funkcji
  print(triple(5));  // 15
}

Zamiast pisać double.call(5), możesz po prostu napisać double(5). Dart automatycznie wywołuje metodę call(), gdy używasz nawiasów na obiekcie.

Metoda call() może przyjmować dowolne parametry i zwracać dowolny typ, tak jak zwykła metoda:

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'));  // Cześć, Alice!
  print(hello('Bob', punctuation: '?'));  // Cześć, Bob?
}

Ten wzorzec jest przydatny, gdy potrzebujesz obiektów, które zachowują się jak funkcje, ale także przechowują stan lub konfigurację. Jest powszechnie używany do tworzenia wielokrotnego użytku operacji, walidatorów lub formaterów, które muszą pamiętać ustawienia między wywołaniami.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system formatowania tekstu, w którym obiekty formatujące można wywoływać bezpośrednio, tak jak funkcje! Utworzysz klasy wywoływalne, które przekształcają tekst na różne sposoby, zachowując przy tym swoje ustawienia konfiguracyjne.

Podzielisz kod na dwa pliki:

  • formatters.dart: Utwórz dwie klasy wywoływalne, które przekształcają ciągi znaków:
    • Klasa Wrapper, która otacza tekst konfigurowalnym prefiksem i sufiksem. Powinna przechowywać ciągi znaków prefix i suffix, a jej metoda call() powinna przyjmować String text i zwracać tekst otoczony prefiksem i sufiksem.
    • Klasa Repeater, która powtarza tekst konfigurowalną liczbę razy. Powinna przechowywać liczbę całkowitą times, a jej metoda call() powinna przyjmować String text i zwracać tekst powtórzony tyle razy, oddzielony spacjami.
  • main.dart: Zaimportuj swoje formatery i pokaż, jak można używać tych obiektów tak jak funkcji:
    • Utwórz obiekt Wrapper z prefiksem '[' i sufiksem ']'
    • Utwórz kolejny obiekt Wrapper z prefiksem '***' i sufiksem '***'
    • Utwórz obiekt Repeater z wartością 3 parametru times
    • Wywołaj pierwszy obiekt wrapper z 'Hello' i wypisz wynik
    • Wywołaj drugi obiekt wrapper z 'Important' i wypisz wynik
    • Wywołaj obiekt repeater z 'Go' i wypisz wynik
    • Pokaż łączenie wywołań, przekazując wynik pierwszego obiektu wrapper (z 'Nested') do drugiego obiektu wrapper, a następnie wypisz wynik

Zwróć uwagę, że możesz wywoływać obiekty formatujące bezpośrednio, używając nawiasów, tak jak w przypadku zwykłych funkcji. Umożliwia to metoda call(), a każdy obiekt zapamiętuje swoją konfigurację między kolejnymi użyciami!

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'formatters.dart';

void main() {
  // TODO: Utwórz Wrapper z prefix '[' i suffix ']'
  
  // TODO: Utwórz kolejny Wrapper z prefix '***' i suffix '***'
  
  // TODO: Utwórz Repeater z times ustawionym na 3
  
  // TODO: Wywołaj pierwszy Wrapper z 'Hello' i wypisz wynik
  
  // TODO: Wywołaj drugi Wrapper z 'Important' i wypisz wynik
  
  // TODO: Wywołaj Repeater z 'Go' i wypisz wynik
  
  // TODO: Zademonstruj łańcuchowe wywołanie, przekazując wynik pierwszego Wrapper
  // (wywołanego z 'Nested') do drugiego Wrapper, i wypisz wynik
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online