end
feature -- Основные операции
infix '+' (other: VECTOR [G]): VECTOR is
-- Поэлементное сложение текущего вектора с other
require ... do
...
end
... Прочие компоненты ...
invariant
non_negative_count: count >= 0
end
Применение инфиксной записи продиктовано соображениями удобства. Для удобства введены и синонимы в обозначении
Обратимся к функции '
infix '+' (other: VECTOR [G]): VECTOR is
-- Поэлементное сложение текущего вектора с other
require
count = other.count
local
i: INTEGER
do
'Создать Result как массив из count элементов'
from i := 1 until i > count loop
Result.put(item (i) + other.item (i), i)
i := i + 1
end
end
Выражение в прямоугольнике - результат сложения
Рис. 16.5. Поэлементное сложение векторов
Но подобная схема не работает! Операция
С прежними родовыми классами: контейнерами
Этот случай отнюдь не является исключением. Вот еще два примера того же рода.
[x]. Предположим, вы проектируете класс, описывающий структуру данных с операцией
[x]. При разработке таких базисных структур данных как словари зачастую используется для хранения данных хеш-таблица, в которой место элемента определяется ключом, вычисляемым по значению элемента. Элементы, размещаемые в словаре должны принадлежать классу, допускающему применение хеш-функции, вычисляющей ключ каждого элемента.
Не ОО-подход
Переходя к решению этой проблемы, посмотрим, как с такой задачей справлялись другие, не ОО- языки.
В языке Ada нет классов, но зато есть пакеты для группировки взаимосвязанных типов и операций. Пакет может быть родовым, с родовыми параметрами, представляющими типы. При этом возникает та же проблема: пакет
Решение в языке Ada рассматривает необходимые операции, например инфиксное сложение, как родовые параметры. Параметрами пакета могут быть не только типы, как при объектном подходе, но и подпрограммы. Например:
generic
type G is private;
with function '+' (a, b: G) return G is <>;
with function '*' (a, b: G) return G is <>;
zero: G; unity: G;
package VECTOR_HANDLING is
... Интерфейс пакета ...
end VECTOR_HANDLING
Заметим, что наряду с типом
package BOOLEAN_VECTOR_HANDLING is
new VECTOR_HANDLING (BOOLEAN, 'or', 'and', false, true);