Вызываемые классы
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy. Урок 84 из 110.
В Dart можно make экземпляры class callable like function, реализовав method call(). Это позволяет использовать object с синтаксисом вызова function — непосредственно используя скобки у экземпляра.
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 - вызов объекта как функции
print(triple(5)); // 15
}Когда вы пишете double(5), Dart автоматически вызывает call() method с 5 в качестве аргумента. Объект ведёт себя как function, сохраняя при этом своё состояние (поле factor).
Метод call() может иметь любую сигнатуру — multiple параметров, необязательные параметры или даже return разные типы:
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')); // Привет, Алиса!
print(hello('Bob', punctuation: '.')); // Привет, Боб.
}Callable class полезны, когда вам нужно поведение, подобное function, в сочетании с состоянием или конфигурацией. Их часто используют для создания повторно используемых операций, валидаторов или преобразований, которым нужно запоминать настройки между вызовами.
Задание
ЛегкоДавайте создадим систему форматирования текста с использованием callable-классов! Вы создадите объекты, которые можно вызывать как function, чтобы преобразовывать текст разными способами, сохраняя при этом собственные настройки конфигурации.
Вы организуете свой код в два файла:
formatters.dart: Create два callable-класса, которые преобразуют текст:- Класс
Wrapper, который оборачивает текст в prefix и suffix. Он должен хранитьString prefixиString suffix, а при вызове с параметромString textвозвращать текст, обёрнутый между prefix и suffix. - Класс
Repeater, который повторяет текст определённое количество раз. Он должен хранить значениеint times, а при вызове с параметромString textвозвращать текст, повторённый указанное количество раз, с пробелом между каждым повторением.
- Класс
main.dart: Импортируйте свои formatters и продемонстрируйте, как работают callable-классы:- Create
Wrapperс prefix"["и suffix"]" - Create another
Wrapperс prefix"***"и suffix"***" - Create
Repeater, который повторяет 3 раза - Вызовите first wrapper с
"Hello"и выведите result - Вызовите second wrapper с
"Important"и выведите result - Вызовите repeater с
"Go"и выведите result - Наконец, Combine их: вызовите first wrapper с результатом вызова repeater с
"Dart"и выведите result
- Create
Обратите внимание, как каждый объект форматировщика запоминает свою конфигурацию и может вызываться напрямую со скобками, точно так же, как function!
Ожидаемый вывод:
[Hello]
***Important***
Go Go Go
[Dart Dart Dart]Попробуйте сами
import 'formatters.dart';
void main() {
// TODO: Создайте Wrapper с префиксом "[" и суффиксом "]"
// TODO: Создайте ещё один Wrapper с префиксом "***" и суффиксом "***"
// TODO: Создайте Repeater, который повторяет 3 раза
// TODO: Вызовите первый wrapper с "Hello" и выведите результат
// TODO: Вызовите второй wrapper с "Important" и выведите результат
// TODO: Вызовите repeater с "Go" и выведите результат
// TODO: Объедините их: вызовите первый wrapper с результатом
// вызова repeater с "Dart", и выведите результат
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн РепозиторийПотренируйтесь самостоятельно: Онлайн-компилятор Dart