В этом примере логическая операция or используется как сложение, and - умножение, а также задаются соответствующие значения для
Являясь решением для Ada, данный прием не применим в объектной среде. Основа ОО-подхода - приоритет типов данных над операциями при декомпозиции ПО, чьим следствием является отсутствие независимых операций. Всякая операция принадлежит некоторому типу данных, основанному на классе. Следовательно, возникшая 'на пустом месте' функция, скажем, infix '+', не может быть фактическим родовым параметром, стоящим в одном ряду с типами
Ограничение родового параметра
Эти наблюдения дают решение. Мы должны оперировать исключительно терминами классов и типов.
Потребуем, чтобы любой фактический параметр, используемый классом
Синтаксически это выглядит так:
class C [G -> CONSTRAINING_TYPE] ... Все остальное как обычно ...
где
[x]. в роли фактических родовых параметров могут выступать лишь типы, совместимые с
[x]. в классе
Какое родовое ограничение использовать для класса
indexing
description: 'Векторы, допускающие сложение'
class
VECTOR [G -> NUMERIC]
... Остальное - как и раньше (но теперь правильно!) ...
После чего ранее некорректная конструкция в теле цикла
Result.put(item (i) + other.item (i), i)
становится допустимой, поскольку
Следующие родовые порождения корректны, если полагать, что все классы, представленные как фактические родовые параметры, являются потомками
VECTOR [NUMERIC]
VECTOR [REAL]
VECTOR [COMPLEX]
Класс
Абстрактный характер
Аналогично описываются класс словаря и класс, поддерживающий сортировку:
class DICTIONARY [G, H -> HASHABLE] ...
class SORTABLE [G -> COMPARABLE] ...
Игра в рекурсию
Вот некий трюк с нашим примером: спросим себя, возможен ли вектор векторов? Допустим ли тип
Ответ следует из предыдущих правил: только если фактический родовой параметр совместим с
indexing
description: 'Векторы, допускающие сложение'
class
VECTOR [G -> NUMERIC]
inherit
NUMERIC