Перейти к основному содержимому

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

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

В общем случае обобщенный тип указывается в угловых скобках после названия метода и дублируется в местах указания типов параметров и возвращаемого значения. Так, например, в программном коде выглядит сигнатура обобщенного метода ПолучитьИлиУмолчание() для объекта Настройки типа ЧитаемоеСоответствие<Строка, Объект>:

Настройки.ПолучитьИлиУмолчание<ТипУмолчания>(Ключ: Строка, ВычислительУмолчания: () -> ТипУмолчания): Объект|ТипУмолчания

А так выглядит его абстрактная системная реализация:

метод Настройки.ПолучитьИлиУмолчание<Т>(Ключ: Строка, ВычислительУмолчания: () -> Т): Объект|Т
если Настройки.СодержитКлюч(Ключ)
возврат Настройки[Ключ] // Тип: Объект
;
возврат Вычислитель() // Тип: Т
;

По указанному ключу данный метод находит и возвращает соответствующее значение типа Объект. Если же искомая настройка по ключу не найдена, будет использоваться умолчание типа Строка:

Настройки.ПолучитьИлиУмолчание<Строка>(Ключ: Строка, ВычислительУмолчания: () -> Строка): Объект|Строка

Так будет выглядеть вызов метода:

метод ПроверитьНастройки()
пер Настройки: Соответствие<Строка, Объект> = {"Язык": "Русский", "Тема": "Темная", "Часовой пояс" : ЧасовойПояс.Текущий()}

пер Язык = Настройки.ПолучитьИлиУмолчание<Строка>("Язык", () -> "Настройка не найдена") // Русский
пер РазмерШрифта = Настройки.ПолучитьИлиУмолчание<Число>("Размер шрифта", () -> "Настройка не найдена") // Настройка не найдена
пер Пояс = Настройки.ПолучитьИлиУмолчание("Часовой пояс", () -> "Настройка не найдена") // Europe/Moscow
;

Таким образом, ТипУмолчания можно рассматривать как переменную типа, вместо которой при вызове подставляется необходимый тип, например Объект или Строка в примере выше.

примечание

В текущей версии системы обобщенными могут быть только системные методы — у пользователей нет возможности создавать свои обобщенные методы.

Синтаксис

При описании системного обобщенного метода используется следующий синтаксис (сигнатура):

ИмяМетода<ОбобщенныйТип_1, …, ОбобщенныйТип_N>(Параметр_1, …, Параметр_N: ОбобщенныйТип_1, …, ОбобщенныйТип_N): ОбобщенныйТип

Примеры обобщенных методов:

Вызов

В общем случае вызов обобщенного метода отличается от вызова обычного метода только указанием желаемого типа в угловых скобках после имени метода:

ИмяМетода<ОбобщенныйТип_1, ..., ОбобщенныйТип_N>(Параметр_1, ..., Параметр_N)

Например:

Макс<Число>(1, 7, 2, -1)

Если тип может быть выведен из контекста (по типу параметров), то явно этот тип указывать не требуется:

// Записи равносильны
Макс<Число>(1, 7, 2, -1)
Макс(1, 7, 2, -1)

Ограничения в синтаксисе

Существуют следующие ограничения в синтаксисе:

  • При указании обобщенного типа в треугольных скобках не должно быть пробела перед открывающей скобкой:
ИмяМетода<Тип1>
ИмяМетода <Тип1>
  • Перед оператором сравнения < должен быть пробел:
а.поле1 < б.поле2
а.поле1< б.поле2

Ссылки на методы

Ссылки на методы указываются аналогично синтаксису вызова:

&Метод<Тип>
&Тип.Метод<Тип>

Пример использования в программном коде:

// Получаем метод по ссылке
пер НайтиМинимумДвухЧисел = &Мин<Число>(Число, Число)
// Вызов метода
пер Результат = НайтиМинимумДвухЧисел(10, 5) // 5

См. также