Menu
Coddy logo textTech

Klasy wywoływalne

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

W języku Dart możesz sprawić, że instancje klasy będą wywoływalne jak funkcje, implementując metodę call(). Dzięki temu możesz używać obiektu w składni wywołania funkcji — stosując nawiasy bezpośrednio do instancji.

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

Gdy zapisujesz double(5), Dart automatycznie wywołuje metodę call(), przekazując 5 jako argument. Obiekt zachowuje się jak funkcja, a jednocześnie zachowuje swój stan (pole factor).

Metoda call() może mieć dowolną sygnaturę — wiele parametrów, parametry opcjonalne, a nawet zwracać różne typy:

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.
}

Klasy wywoływalne są przydatne, gdy potrzebujesz zachowania podobnego do funkcji połączonego ze stanem lub konfiguracją. Są powszechnie używane do tworzenia wielokrotnego użytku operacji, walidatorów lub przekształceń, które muszą pamiętać ustawienia między wywołaniami.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system formatowania tekstu przy użyciu klas wywoływalnych! Utworzysz obiekty, które można wywoływać jak funkcje, aby przekształcać tekst na różne sposoby, zachowując przy tym własne ustawienia konfiguracji.

Podzielisz kod na dwa pliki:

  • formatters.dart: Utwórz dwie klasy wywoływalne, które przekształcają tekst:
    • Klasę Wrapper, która otacza tekst prefiksem i sufiksem. Powinna przechowywać String prefix i String suffix, a po wywołaniu z parametrem String text zwracać tekst ujęty między prefiksem a sufiksem.
    • Klasę Repeater, która powtarza tekst określoną liczbę razy. Powinna przechowywać wartość int times, a po wywołaniu z parametrem String text zwracać tekst powtórzony tyle razy, z odstępem między każdym powtórzeniem.
  • main.dart: Zaimportuj swoje formatery i pokaż, jak działają klasy wywoływalne:
    • Utwórz klasę Wrapper z prefiksem "[" i sufiksem "]"
    • Utwórz kolejną klasę Wrapper z prefiksem "***" i sufiksem "***"
    • Utwórz klasę Repeater, która powtarza 3 razy
    • Wywołaj pierwszy wrapper z "Hello" i wyświetl wynik
    • Wywołaj drugi wrapper z "Important" i wyświetl wynik
    • Wywołaj repeater z "Go" i wyświetl wynik
    • Na koniec połącz je: wywołaj pierwszy wrapper z wynikiem wywołania repeatera z "Dart" i wyświetl wynik

Zwróć uwagę, że każdy obiekt formatera zapamiętuje swoją konfigurację i można go wywołać bezpośrednio za pomocą nawiasów, tak jak funkcję!

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'formatters.dart';

void main() {
  // TODO: Utwórz Wrapper z prefiksem "[" i sufiksem "]"
  
  // TODO: Utwórz kolejny Wrapper z prefiksem "***" i sufiksem "***"
  
  // TODO: Utwórz Repeater, który powtarza 3 razy
  
  // 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: Połącz je: wywołaj pierwszy Wrapper z wynikiem
  // wywołania Repeater z "Dart" 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