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

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 Например :

type

 

Garden

 

( D :    access

 

Zoo

 

' Class ) is   new

 

Domen

 

with ...

 

Ш        СОВЕТЫ:

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

ИЗМЕНЕНИЯ:

О Тип запись ( или приватный тип ) может быть помечен как тэговый и может быть расширен при создании производных типов.

О Введено понятие атрибута Class и типа широкого класса (Class-Wide type ).

О Введено понятие диспетчерской операции и диспетчерского вызова подпрограммы ( dispatching call).

О Введено понятие абстрактного типа и абстрактной подпрограммы.