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

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

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

Товары.ПолучитьИлиУмолчание<T>(КодТовара: T, ЗначениеПоУмолчанию = Неопределено): T // T — обобщенный тип

а так — вызов этого метода для типов Число и Строка соответственно:

Товары.ПолучитьИлиУмолчание<Число>(0120300, 0000000)
Товары.ПолучитьИлиУмолчание<Строка>("твр0120300", "твр0000000")

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

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

Синтаксис

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

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

Например:

  • Минимум<Т это Сравнимое>(Т, Т)
  • ЧитаемоеСоответствие<ТипКлюча, ТипЗначения>.ПолучитьИлиУмолчание<ТипУмолчания>(Ключ: ТипКлюча, Умолчание: ТипУмолчания): ТипЗначения|ТипУмолчания
  • ЗапланированныеЗадания.Создать<Т1, Т2>(Обработчик: (Т1, Т2)->Объект?, Параметр1: Т1, Параметр2: Т2)
  • ФоновыеЗадания.Выполнить<Т1, Т2>(Обработчик: (Т1, Т2)->Объект?, Параметр1: Т1, Параметр2: Т2)

Вызов

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

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

Например:

пер Коэффициенты = [1, 7, 2, -1]
Максимум<Число>(Коэффициенты)

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

Максимум(Коэффициенты) // Запись равносильна предыдущей
Примечание: Существуют следующие ограничения в синтаксисе:
  • При указании обобщенного типа в треугольных скобках не должно быть пробела перед открывающей скобкой: Правильно:ИмяМетода<Тип1> | Неправильно:ИмяМетода <Тип1>
  • Перед оператором сравнения Меньше должен быть пробел: Правильно:a.поле1 < b.поле2 | Неправильно:a.поле1< b.поле2

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

По аналогии с синтаксисом вызова:

&Метод<Тип>
&Тип.Метод<Тип>
Подробнее о ссылках на методы смотрите здесь.