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



         

Расширение существующего типа данных


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

Рассмотрим следующий пример описания:

type Object_1 is tagged

record

Field_1 : Integer; end record;

В данном случае тип Object_1 содержит всего одно поле Field_1 типа Integer, и описан как тэговый тип.

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

Теперь, в качестве примера, мы можем описать производные от Object_1 типы, расширяя их новыми компонентами следующим образом:

type Object_2 is new Object_1 with

record

Field_2 : Integer; end record;

type Object_3 is new Object_2 with

record

Field_3 : Integer; end record;

В данном примере, тип Object_2 является производным типом от типа Object_1, а тип Object_3 - производным типом от типа Object_2.

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

Object_1 | Object_2 | Object_3

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

Поэтому все описанные выше типы: Object_1, Object_2 и Object_3, - являются тэговыми типами, и, следовательно, обладают способностью расширения.

В результате показанных выше описаний, типы Object_1, Object_2 и Object_3

будут содержать следующие поля:

Object_1

Object_2

Object_3

Field_1 Field_1 Field_1
Field_2 Field_2
    Field_3

Примечательным фактом является то, что описание типа Object_2

не указывает явно наличие поля Field_1.

Это поле наследуется от типа Object_1.

Также, описание типа Object_3

не указывает явно наличие полей Field_1 и Field_2.

Эти поля наследуются от типа Object_2.




Содержание  Назад  Вперед