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

16.5 абстрактные типы и подпрограммы

Механизм абстрактных типов и абстрактных подпрограмм обеспечивает в языке реализацию парадигм обьектно-ориентированного программирования, связанных со смешанным и множественным наследованием.

Абстрактный тип задает основу для создания типов с общими свойствами. Абстрактные процедуры - для определения примитивных операций для абстрактных типов.

206

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

Абстрактный тип - это тэговый тип, используемый как родитель­ский при расширениях типа, однако он не может иметь обьектов ( нельзя обьявить обьект абстрактного типа ).

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

Абстрактная подпрограмма предназначена для абстрактных тэ-говых типов. Она не может быть вызвана прямо или косвенно.

Абстрактный тип описывается как тэговый тип, абстрактная подпрограмма описывается как обычная подпрограмма , при этом добавляется ключевое слова abstract.

type   Monstr  is  abstract   tagged    null   record;

function     Demon   return   Monstr   is   abstract; procedure   Unit (X , Y : In integer;  Z ;

in  out  Monstr)  is   abstract;

Для типов, производных от абстрактного типа, следует обеспечить фактические подпрограммы, необходимые для реализации абстрактных подпрограмм родительского типа.

П Например:

package    SET   is

type  Oil  is   abstract    tagged    null     record; procedure Work (X:   in  out  Oil)  is   abstract;

end  SET;

Процедура Work определена для абстрактного типа Oil ; она не имее тела.

Пакет SET с его абстрактными ресурсами можно использовать при разработке нового пакета :

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

with    SET; package   LIST  is

type Ointment   is   new  SET. Oil  with record

P:    real; end   record ; procedure  Work (О :   in   out  Ointment);   - -   совмещенная

- -    процедура procedure  Olive (О :   in   Ointment);

end    LIST ;

В пакете LIST определен тип Ointment как расширение абст­рактного типа Oil с добавлением компоненты Р. Для типа Ointment определены две операции - подпрограмма Work и Olive. Процедура Olive не является абстрактной , процедура Work является совмещенной и определяет фактическую подпрограмму для абстрак­тной подпрограммы Work из пакета SET.

В теле пакета LIST выполнена реализация процедуры Work, то есть находится ее тело.:

package body  LIST  is

procedure  Work (О :   in   out  Ointment)  is begin

O: = Olive (O); end Work ; end   LIST;

Таким образом, для тэговых типов и его потомков определены три вида операций:

•   примитивные неабстрактные;

•   примитивные абстрактные;

•   операции широкого класса.

208

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

Неабстрактные операции должны переопределяться для каждого подкласса.

Абстрактные операции должны быть совмещенными с операциями для неабстрактных производных типов.

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

Если новый тип произведен от тэгового, то он наследует его при­митивные операции. Если необходимо не наследовать некоторые операции, то их следует рассматривать либо как операции широкого класса, либо описывать их в отдельном дочернем пакете.

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

СОВЕТЫ:

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

*   Используйте абстрактные типы для различных реализаций одной абстракции.

*  Определяйте корневой тип класса как абстрактный.

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

type Data    is     abstract   tagged     private;

procedure Zond ( X :   in    Data ; Y :   out Data )   is   abstract;

function     Fast  (X:   Data)   return    Data    is   abstract;

private

type     Data    is   abstract   tagged    null    record;

end    ABSTRACTJDATA ;

Пакет ABSTRACT_DATA обеспечивает абстрактную спецификацию набора данных. Тип Data описан как абстрактный тэговый приватный тип. Абстрактные подпрограммы Zond и Fast определяют при­митивные операции для типа Data. При этом они не имеют тел и не могут быть непосредственно вызваны.

На основании типа Data может быть выполнено расширение типа с добавлением компонент и совмещенными операциями для абс­трактных процедур Zond и Fast.

Реализация абстракций,   определенных в пакете ABSTRACT_ DATA , выполняется в пакете RR_DATA.

use   ABSTRACT DATA;

with   ABSTRACT_DATA; package RR_DATA   is

RR)   is   abstract; is abstract;

Тело пакета  RR Data :