Введение в программирование - Учебное пособие (Корочкин А. В.)

16.3 типы широкого класса.

Объединение тэговых типов  и его потомков ( типов, производных от тэгового типа ) формирует     производные классы тэговых типов.

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

Для каждого тэгового типа Т в языке автоматически определяется соответствующий тип Т 'Class, называемый типом широкого класса ( class-wide type ). Тип Т 'Class объединяет все типы, производные от типа Т, и является неограниченным, так как всегда возможно его расширение.

Тип широкого класса определяется для каждого класса производ­ных типов, корнем которого является тэговый тип. Множество зна­чений типа Т 'Class - это имеющее дискриминант объединение мно­жества значений каждого специфического типа в производном классе, корнем которого является тип Т. В качестве дискриминанта здесь выступает тэг каждого тэгового типа из класса. Каждый объект типа Т 'Class имеет:

•   тэг, который отличает его от всех других типов класса;

•   значение, тип которого определяется соответствующим тэгом. Идентификация с использование тэга может выполняться динами­чески, во время выполнения программы.

Для каждого подтипа S тэгового типа Т определены следующие атрибуты:

•   S ' Class  -   подтип класса T'Class .

•   S ' Tag     -   означает тэг подтипа  S.

•   Т ' Tag     -   тэг  корневого типа класса.

D Например: package AVTO  is

type  Cars   is tagged   - -   корневой тип    класса Cars record

end   record ; procedure   Motor (X : in   out  Cars);

203

202

Ада 95. Введение в программирование

Глава 16. Обьектно-ориентированное программирование

type Ford   is new Cars with    - - расширение типа    Cars record

end   record ;

procedure  Motor (X : in   out   Ford ); procedure  Cord (X :        out    Ford );

type Opel   is new Cars with    - - расширение типа    Cars record

end record;

procedure   Motor  (X: in   out  Opel); procedure  Glass  (Y:       out  Opel)

- - расширения типа Opel

type Cadet   is   new    Opel    with    . . .   end  record; type Vectra   is   new    Opel    with   . . .    end record; end  AVTO ;

Дерево иерархии производных классов, основанных на типе   Cars в пакете AVTO:

Ford' Class

Cars ' Class

Cadet' Class

Opel' Class

Vectra' Class

Тип Cadet не является подтипом Opel, это разные типы и при совместном использовании они требуют явного преобразования. Класс Cars ' Class объединяет все типы, основанные на тэговом типе Cars : Ford, Opel, Cadet, Vectra. Подкласс Opel 'Class имеет в качестве корневого типа Opel и объединяет типы Cadet и Vectra.

ffl СОВЕТЫ:

*   Используйте операции типа широкого класса в случаях, когда не известны все возможные потомки для данного тэгового типа.

*   Используйте операции типа  широкого  типа, когда желательно

избежать наследования или совмещения. »  Используйте тип широкого класса для реализации динамического

полиморфизма.

*  Используйте тип широкого класса вместо переменных записей.

*  Избегайте использование расширенных типов для параметризации абстракций.

*  Используйте тип широкого класса в качестве интефейса для набора тэговых типов, образующих класс.