Расширение существующего типа данных
Как было сказано ранее, тэговые типы, в отличие от обычных не тэговых типов, позволяют осуществлять расширение структуры данных типа предка при наследовании.
Рассмотрим следующий пример описания:
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
будут содержать следующие поля:
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.