Основы объектно-ориентированного проектирования


Ограниченная универсальность


Рассматривая ограниченную универсальность можно теперь исходить из той же общей схемы. В примере с матрицами:

class MATRIX [G] feature anchor: RING_ELEMENT [G] ...Другие компоненты как ранее ... end

класс, задающий элементы кольца, теперь объявляется так:

deferred class RING_ELEMENT [G] feature item: G put (new: G) is do item := new end ... Другие компоненты как ранее... end

Использование одного и того же родового параметра для двух связанных классов, RING_ELEMENT и MATRIX, гарантирует согласованность типов: все элементы данной матрицы будут принадлежать типу RING_ELEMENT [G] с одним и тем же G.

Аналогично можно создать универсальный класс COMPARABLE:

deferred class COMPARABLE [G] feature item: G put (new: G) is do item := new end ...Другие компоненты (infix "<=", minimum) как ранее ... end

Компоненты класса (infix "<=", minimum) представляют ограничения (программы в форме Ada). Ранее заданные потомки становятся совершенно простыми:

class INTEGER_COMPARABLE inherit COMPARABLE [INTEGER] creation put end

(Заметьте, это полностью заданный класс, а не его схема, в которую следует добавлять компоненты!) Этот же прием непосредственно применим ко всем другим вариантам, таким как STRING_COMPARABLE.

Эта простая в применении техника приводит к следующему принципу эмуляции:

Эмуляция ограниченной универсальности (2)

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

Но снова ничто не дается даром: нам понадобилось введение обертывающих классов, таких как INTEGER_COMPARABLE. Это менее шокирует, в сравнении с предыдущим решением, поскольку некоторую цену следует платить за ограничение универсальности. Кажется, что здесь есть оправдание появлению обертывающих классов и объектов, поскольку ограниченная универсальность - сама по себе довольно изощренная идея.

Основываясь на этих наблюдениях, нотация этой книги и компиляторы, разработанные для нотации, первоначально - немногим более двух лет с 1985 до 1988 - включали специальную поддержку ограниченной универсальности.


Начало  Назад  Вперед