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


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


Хотя неограниченная универсальность представляет более простой случай, с ней связана главная сложность. Рассмотрим для нее специальный механизм, позволяющий избежать введения наследования. Позволим нашим классам иметь неограниченные родовые параметры, вспомнив (наконец-то), о чем говорилось в самых первых лекциях курса "Основы объектно-ориентированного программирования" - класс может быть определен как:

class C [G, H, ...] ...

Здесь параметры представляют произвольные типы без всяких ограничений. Для получения непосредственно используемого типа строится родовое порождение с заданными фактическими родовыми параметрами:

x: C [DEVICE, RING_ELEMENT, ...]

Такой подход непосредственно применим к классу очереди, который может быть просто определен как:

indexing description: "Очередь, реализованная массивом" class QUEUE [G] creation ... Все остальное как ранее, но удалив объявление item_anchor и заменив все вхождения типа like item_anchor на G ... end

Мы избавились от класса QUEUABLE так же, как и от INTEGER_QUEUABLE и всех других потомков. Для получения очереди целых будем просто использовать тип QUEUE [INTEGER], непосредственно манипулируя целыми, а не обертывающими их объектами.

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

Обеспечение неограниченной универсальности

Наряду с наследованием желательно обеспечить специальную нотацию для объявления классов как универсальных (неограниченных).




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