Обобщенные типы
Обобщенные типы можно рассматривать как универсальные шаблоны, параметризуемые типами. Обобщенные типы позволяют избежать жесткого определения используемых типов. Если данные и/или алгоритмы применяются для различных типов, использование обобщенных типов позволяет:
- избежать повторного написания программного кода;
- реализовывать более универсальные алгоритмы.
Синтаксис
Синтаксис объявления обобщенного типа:
имя-типа<имя-типа-параметра, ..., имя-типа-параметра>
- имя-типа — имя обобщенного типа;
- имя-типа-параметра — параметры обобщенного типа.
Параметры можно указывать в именованной форме:
имя-типа<имя-параметра1 = Тип1, ..., имя-параметраN = ТипN>
Например:
Соответствие<Число, ТипЗначения = Строка>
Ограничения:
- в именованной форме нельзя указать параметры функциональных типов;
- именованные параметры должны следовать строго за позиционными (при их наличии).
Возможные ограничения на типы-параметры
На типы-параметры (переменные типа в объявлении, например, Т в Массив<Т>) некоторых обобщенных типов могут накладываться ограничения. Всего есть два типа ограничений:
- Ограничение на иерархию — тип-специализация (конкретный тип, подставляемый вместо параметра, например,
ЧисловМассив<Число>) должен иметь определенный базовый тип. - Ограничение на наличие значения по умолчанию — тип-специализация должен иметь значение по умолчанию.
При попытке объявить тип с неподходящим типом-специализацией возникает ошибка компиляции.
Информация времени выполнения
Информация о типах-параметрах обобщенного типа сохраняется до времени выполнения. При проверке типа с помощью операции это данная информация учитывается. Пример:
метод Обработать()
пер СоставнойМассив = [10, "20", 30, 40] // Массив<Число|Строка>
пер МассивСтрок = ["10", "20", "30", "40"] // Массив<Строка>
пер МассивЧисел = [10, 20, 30, 40] // Массив<Число>
пер Сравнение: Булево = СоставнойМассив это Массив<Строка|Число> // Истина
для Индекс = 0 по СоставнойМассив.Размер() - 1
если СоставнойМассив[Индекс] это Число
СоставнойМассив[Индекс] = СоставнойМассив[Индекс].ВСтроку()
;
;
// СоставнойМассив содержит только строки, но его составной тип остался Массив<Строка|Число>
Сравнение = СоставнойМассив == МассивСтрок // Истина (сравнение по содержимому)
Сравнение = СоставнойМассив == МассивЧисел // Ложь (разное содержимое)
Сравнение = СоставнойМассив это Массив<Строка|Число> // Истина (параметры обобщенного типа не изменились)
Сравнение = СоставнойМассив это Массив<Строка> // Несовместимые типы Массив<Число|Строка> и Массив<Строка>
;