Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

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

Абстрактный тип — это помеченный тип, предназначенный для использования в качестве предка других типов, но не допускающий создания собственных объектов. Абстрактная подпрограмма — это подпрограмма без тела, предназначенная для переопределения в момент наследования. Поскольку объекты абстрактного типа создать нельзя, вызов подпрограммы с диспетчеризацией всегда выполняется в переопределяющем теле.

Синтаксис

abstract_subprogram_declaration ::=
[overriding_indicator]
subprogram_specification is abstract;

Статические семантики

Типы интерфейсов (см. 3.9.4) являются абстрактными типами. Кроме того, помеченный тип, в объявлении которого присутствует зарезервированное слово abstract, является абстрактным типом. Широкий тип класса (см. 3.4.1), укоренённый в абстрактном типе, сам по себе не является абстрактным типом.

Правила легальности

Только помеченный тип может содержать зарезервированное слово abstract в своём объявлении.
Подпрограмма, объявленная в abstract_subprogram_declaration или formal_abstract_subprogram_declaration (см. 12.6), является абстрактной подпрограммой. Если это примитивная подпрограмма помеченного типа, то помеченный тип должен быть абстрактным.
Если у типа есть неявная примитивная подпрограмма, унаследованная или являющаяся предопределённым оператором равенства, и соответствующая примитивная подпрограмма родительского или предкового типа является абстрактной или является функцией с управляемым результатом доступа, или если тип, отличный от расширения null, наследует функцию с управляемым результатом, то:
  • Если тип является абстрактным или непримеченным, неявная подпрограмма является абстрактной.
  • В противном случае подпрограмма должна быть переопределена неабстрактной подпрограммой или, в случае с частным расширением, наследующим функцию с управляемым результатом, иметь полный тип, который является расширением null. Для типа, объявленного во видимой части пакета, переопределение может быть как во видимой, так и в частной части. Такая подпрограмма называется требующей переопределения. Однако, если тип является формальным типом обобщения, подпрограмма не должна переопределяться для самого формального типа; неабстрактная версия обязательно будет предоставлена фактическим типом.
Вызов абстрактной подпрограммы должен быть вызовом с диспетчеризацией; недиспетчеризуемые вызовы абстрактной подпрограммы недопустимы.
Тип агрегата aggregate, или объекта, созданного с помощью object_declaration или allocator, или формального обобщённого объекта с режимом in, не должен быть абстрактным. Тип целевого объекта операции присваивания (см. 5.2) не должен быть абстрактным. Тип компонента не должен быть абстрактным. Если тип результата функции является абстрактным, то функция должна быть абстрактной.
Если частичный вид не абстрактный, соответствующий полный вид не должен быть абстрактным. Если формальный тип обобщения является абстрактным, то для каждой примитивной подпрограммы формального, которая не является абстрактной, соответствующая примитивная подпрограмма фактического не должна быть абстрактной.
Для абстрактного типа, объявленного в видимой части, абстрактная примитивная подпрограмма не должна объявляться в частной части, если только она не переопределяет неявно объявленную абстрактную подпрограмму в видимой части. Для помеченного типа, объявленного в видимой части, примитивная функция с управляемым результатом не должна быть объявлена в частной части, если только она не переопределяет функцию, неявно объявленную в видимой части.
Фактическая обобщенная подпрограмма не должна быть абстрактной подпрограммой, если только формальная обобщенная подпрограмма не объявлена с помощью formal_abstract_subprogram_declaration. prefix ссылки на атрибут attribute_reference для атрибутов Access, Unchecked_Access или Address не должен обозначать абстрактную подпрограмму.

Динамические семантики

Выполнение abstract_subprogram_declaration не имеет эффекта.
ПРИМЕЧАНИЯ
76 Абстрактность не наследуется; чтобы объявить абстрактный тип, зарезервированное слово abstract должно использоваться в объявлении расширения типа.
77 Широкий тип класса никогда не является абстрактным. Даже если класс укоренён в абстрактном типе, широкий тип класса не является абстрактным, и объект широкого типа класса можно создать; тег такого объекта будет идентифицировать какой-либо неабстрактный тип в классе.

Примеры

Пример абстрактного типа, представляющего множество натуральных чисел:
package Sets is
subtype Element_Type is Natural;
type Set is abstract tagged null record;
function Empty return Set is abstract;
function Union(Left, Right : Set) return Set is abstract;
function Intersection(Left, Right : Set) return Set is abstract;
function Unit_Set(Element : Element_Type) return Set is abstract;
procedure Take(Element : out Element_Type;
From : in out Set) is abstract;
end Sets;
ПРИМЕЧАНИЯ
78 Примечания к примеру: Учитывая вышеуказанный абстрактный тип, можно получить различные (не абстрактные) расширения типа, представляющие альтернативные реализации множества. Можно использовать битовый вектор, но ограничить максимальный представляемый элемент, а другой — хеш-таблицу, обменивая пространство на гибкость.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API