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 СОВЕТЫ: * Используйте операции типа широкого класса в случаях, когда не известны все возможные потомки для данного тэгового типа. * Используйте операции типа широкого типа, когда желательно избежать наследования или совмещения. » Используйте тип широкого класса для реализации динамического полиморфизма. * Используйте тип широкого класса вместо переменных записей. * Избегайте использование расширенных типов для параметризации абстракций. * Используйте тип широкого класса в качестве интефейса для набора тэговых типов, образующих класс. |
| Оглавление| |