Menu
CoddyTech

Обобщенные методы

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy. Урок 66 из 110.

Как и классы, отдельные методы тоже могут иметь собственные параметры типа. Это полезно, когда нужен гибкий метод, но делать весь класс обобщённым не требуется.

Обобщённый метод объявляет параметр типа перед типом возвращаемого значения:

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // привет
}

Dart часто может определить тип по аргументам, поэтому не всегда нужно указывать его явно:

var result = findFirst([10, 20, 30]);  // Dart выводит тип int

Обобщённые методы особенно полезны внутри классов, когда гибкость типов требуется лишь для некоторых операций:

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // Тип определён как int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

Обобщённые методы позволяют точно контролировать безопасность типов на уровне методов, сохраняя классы более простыми и пользуясь при этом проверкой типов во время компиляции.

challenge icon

Задание

Легко

Давайте создадим утилиту преобразования данных, которая продемонстрирует возможности обобщённых методов. Вы создадите класс Transformer с методами, которые могут работать с любым типом, обеспечивая гибкость без необходимости делать весь класс обобщённым.

Вы организуете код в двух файлах:

  • transformer.dart: создайте класс Transformer со следующими обобщёнными методами:
    • T getFirst<T>(List<T> items) — возвращает первый элемент списка
    • T getLast<T>(List<T> items) — возвращает последний элемент списка
    • List<T> repeat<T>(T item, int times) — создаёт список, содержащий указанное количество повторений элемента
    • void printPair<A, B>(A first, B second) — выводит два значения в формате Pair: [first] and [second]
  • main.dart: импортируйте файл с преобразователем и продемонстрируйте каждый обобщённый метод с разными типами:
    • Создайте экземпляр Transformer
    • Примените getFirst к [10, 20, 30] и выведите результат
    • Примените getFirst к ['apple', 'banana', 'cherry'] и выведите результат
    • Примените getLast к [1.5, 2.5, 3.5] и выведите результат
    • Используйте repeat, чтобы создать список из 'Hi', повторённого 4 раза, и выведите результат
    • Используйте repeat, чтобы создать список из 7, повторённого 3 раза, и выведите результат
    • Используйте printPair со значениями 'Name' и 42
    • Используйте printPair со значениями 100 и true

Обратите внимание, что каждый метод объявляет собственные параметры типа, поэтому один и тот же объект Transformer может работать с целыми числами, строками, числами с плавающей точкой и логическими значениями — при этом типобезопасность полностью сохраняется. Метод printPair демонстрирует использование двух параметров типа в одном методе.

Ожидаемый результат:

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

Попробуйте сами

import 'transformer.dart';

void main() {
  // Создайте экземпляр Transformer
  var transformer = Transformer();

  // TODO: Примените getFirst к [10, 20, 30] и выведите результат

  // TODO: Примените getFirst к ['apple', 'banana', 'cherry'] и выведите результат

  // TODO: Примените getLast к [1.5, 2.5, 3.5] и выведите результат

  // TODO: Используйте repeat, чтобы создать список, содержащий 'Hi' 4 раза, и выведите его

  // TODO: Используйте repeat, чтобы создать список, содержащий 7 3 раза, и выведите его

  // TODO: Вызовите printPair с аргументами 'Name' и 42

  // TODO: Вызовите printPair с аргументами 100 и true
}
quiz iconПроверьте себя

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

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

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