16.6 множественная реализация и множественное наследование.Множественная реализация абстракции - важная составляющая обьектно-ориентированного программирования. В Аде 83 она обеспечивалась тем, что пакет мог иметь несколько альтернативных тел. Однако при этом только одна реализация могла использоваться в программе. В Аде 95 множественная реализация основывается на использовании тэговых типов. При множественной реализации абстракции тэг, связанный с объектом, позволяет динамически выбирать соответствующую реализацию. type RR is new Data with private ; procedure Zond ( X : in RR ; Y : out function Fast ( X : RR) return RR private type RR is new Data with record N : integer; end record ; end RR DATA; package body RR_DATA is
Ада 95. Введение в программирование Глава 16. Обьектно-ориентированное программирование 211 procedure Zond (X : in RR ; Y : out RR ) is begin end Zond; function Fast (X : RR ) return RR is begin end Fast; end RR_DATA; Для реализации абстракций из пакета ABSTRACT_DATA можно воспользоваться также типом широкого класса, базирующимся на типе Data. Например, содав процедуру, аргументы которой имеют тип Data'Class. procedure Action (X : in Data'Class; Y: out Data'Class) is Demo: Data'Class ; begin Demo : = Fast (X); Zond ( Demo , Y); end Action ; Вызов процедуры Action является диспетчерским вызовом, то есть ее выполнение зависит от тэга фактического параметра. Множественное наследование позволяет производному типу ( или классу ) иметь несколько родителей. Реализация множественного наследования в языке обеспечивается механизмом библиотечных модулей, использованием приватных расширений, а также с помощью ссылочных дискриминантов. П Пример: package ABSTRACT_SET is type Set is abstract tagged limited private ; procedure Rembo ( X : in out Set) is abstract; function Rolex ( Y : Set) return integer is abstract; private type Set is abstract tagged limited with null record ; end ABSTRACT_SET ; В спецификации пакета ABSTRACT_SET представлен абстрактный тип Set и абстрактные процедуры Rembo и Rolex. В рассматриваемом ниже пакете GOLD определен тип Elem - как производный от Set, при этом интерфейс для работы с ним наследуется из пакета ABSTRACT_SET , а реализация выполнена с использованием некоторого уже существующего типа Data, который может быть описан в другом пакете. With ABSTRACT_SET ; use ABSTRACT_SET; package GOLD is type Elem ( D : Positive) is new Set with private; procedure Rembo ( X : in out Elem ) is abstract; function Rolex (Y : Elem) return integer is abstract; private type Elem is new Data with record Z: Data( 1 .. D); end record ; end GOLD; Для реализации примитивных операций Rembo и Rolex в теле пакета GOLD можно использовать операции, допустимые для типа Data. П Пример 2: 27* В примере рассмотрена реализация смешанного наследования. Здесь один из родителей обеспечивает только свойства для производного класса. Для этого используется комбинация расширения тэгового типа и настраиваемого модуля. generic type Word is abstract tagged private ; package MIX is type Page abstract new Word with private; procedure List (X : in out Page ) is abstract; private type Page is abstract new Word with record - - дополнительные компоненты end record ; end MIX; При конкретизации пакета MIX можно добавлять операции типа Page к существующему тэговому типу. Получаемый при этом тип будет принадлежать к классу типа , задаваемого фактическим типом настройки. Типы Word и Page являются абстрактными, то есть соответствующий формальный тип должен быть тоже абстрактным. D Пример 3: package AMD is type Zoo is limited tagged private; procedure Bear (X : in Zoo); private type Garden ( D : access Zoo) is limited ... type Zoo is limited record E : Garden (Zoo' access ); end record ; end AMD;
213 Глава 16. Обьектно-ориентированное программирование Здесь скрытый в приватной части пакета тип Garden имеет ссылочный дискриминант, причем со ссылкой на тип Zoo . Определение обьекта типа Zoo сязано с созданием динамической структуры (ссылающейся на себя ) для этого обьекта, которая будет включать компоненты типа Garden. Типы Zoo и Garden могут в свою очередь являться расширением некоторого приватного типа Domen . D Например :
Ш СОВЕТЫ: * Используйте ссылочные дискриминанты для обеспечения множественного наследования. ИЗМЕНЕНИЯ: О Тип запись ( или приватный тип ) может быть помечен как тэговый и может быть расширен при создании производных типов. О Введено понятие атрибута Class и типа широкого класса (Class-Wide type ). О Введено понятие диспетчерской операции и диспетчерского вызова подпрограммы ( dispatching call). О Введено понятие абстрактного типа и абстрактной подпрограммы. |
| Оглавление| |