Menu
Coddy logo textTech

Вызываемые классы

Часть раздела Объектно-ориентированное программирование путешествия по 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, в сочетании с состоянием или конфигурацией. Их часто используют для создания повторно используемых операций, валидаторов или преобразований, которым нужно запоминать настройки между вызовами.

challenge icon

Задание

Легко

Давайте создадим систему форматирования текста с использованием 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

Обратите внимание, как каждый объект форматировщика запоминает свою конфигурацию и может вызываться напрямую со скобками, точно так же, как 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", и выведите результат
  
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Dart