Ада-95. Компилятор GNAT


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


В большинстве случаев, типы которые разрабатываются как родоначальники иерархий производных типов не предназначены для непосредственного описания объектов (переменных).

Такие типы называют абстрактными, а для их описания используется зарезервированное слово abstract.

Например:

type Empty_Root is abstract tagged null record;

type Simple_Root is abstract tagged

record

Simple_Field: Integer; end record;

Здесь, в первом случае, тип Empty_Root - это абстрактный тип является "пустой" записью которая не содержит никаких полей. В свою очередь, тип Simple_Root, который также описан как абстрактный, содержит единственное поле Simple_Field типа Integer.

Абстрактный тип может иметь абстрактные подпрограммы.

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

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

Описание абстрактного типа имеющего абстрактные подпрограммы может иметь следующий вид:

package Sets is

type Set is abstract tagged null record;

function Empty return Set is abstract; function Empty(Element : Set) return Boolean is abstract; function Union(Left, Right : Set) return Set is abstract; function Intersection(Left, Right : Set) return Set is abstract; procedure Insert(Element : Natural; Into : Set) is abstract; end Sets;

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

Примечательно то, что компиляор не позволит описать переменную типа Set, поскольку тип Set - это абстрактный тип.

Таким образом, следующий пример не будет компилироваться:

with Sets; use Sets;

procedure Wont_Compile is

My_Set : Set; -- НЕДОПУСТИМО!!! абстрактный тип

begin null; end Wont_Compile;

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




- Начало -  - Назад -  - Вперед -