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.
Wyzwanie
ŁatwyZbudujmy 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 prefixiString suffix, a po wywołaniu z parametremString textzwracać 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 parametremString textzwracać tekst powtórzony tyle razy, z odstępem między każdym powtórzeniem.
- Klasę
main.dart: Zaimportuj swoje formatery i pokaż, jak działają klasy wywoływalne:- Utwórz klasę
Wrapperz prefiksem"["i sufiksem"]" - Utwórz kolejną klasę
Wrapperz 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
- Utwórz klasę
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
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online