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.
Wyzwanie
ŁatwyZbudujmy 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ówprefixisuffix, a jej metodacall()powinna przyjmowaćString texti zwracać tekst otoczony prefiksem i sufiksem. - Klasa
Repeater, która powtarza tekst konfigurowalną liczbę razy. Powinna przechowywać liczbę całkowitątimes, a jej metodacall()powinna przyjmowaćString texti zwracać tekst powtórzony tyle razy, oddzielony spacjami.
- Klasa
main.dart: Zaimportuj swoje formatery i pokaż, jak można używać tych obiektów tak jak funkcji:- Utwórz obiekt
Wrapperz prefiksem'['i sufiksem']' - Utwórz kolejny obiekt
Wrapperz prefiksem'***'i sufiksem'***' - Utwórz obiekt
Repeaterz wartością3parametru 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
- Utwórz obiekt
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
}
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