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 : |
| Оглавление| |