это компонент Human_Sibling, любой объект
- Последовательная генерация объектов
Поскольку To_Controlled_Sibling - это компонент Human_Sibling, любой объект типа Controlled_Sibling каждый раз создается автоматически при создании объекта типа Human_Sibling.
Связка To_Controlled_Sibling автоматически инициализируется ссылкой на заключенный объект, поскольку атрибут
'Access применяется к имени типа записи, внутри описания, автоматически обозначая текущий экземпляр типа.
Как результат, описание:
CH: Human_Sibling;
автоматически объявляет объект концептуального типа Controlled_Human
Примитивные операции могут быть переопределены тем сдвоенным типом который их реализует (например, Finalize). Например, для предотвращения утечки памяти, мы переопределяем Finalize
для автоматической очистки памяти, используемой First_Name, когда Human становится не доступным:
package body Controlled_Human is
procedure Free is new Unchecked_Deallocation (String_Ptr);
procedure Finalize (C: in out Controlled_Sibling) is
-- overrides Finalize inherited from Controlled
begin
Free (C.To_Human_Sibling.all.First_Name); end Finalize;
end Controlled_Human;
|
- Доступ ко всем компонентам и операциям
Компоненты каждого сдвоенного объекта могут быть выбраны и использованы любым из сдвоенных объектов, используя связки. Например, операция Finalize
(описанная для Controlled_Sibling) может использовать компонент First_Name
(описанный для Human_Sibling).
Примитивные операции могут быть вызваны тем же самым способом.
К концептуальному типу могут быть легко добавлены новые свойства, компоненты и операции, путем расширения любого из сдвоенных объектов. Для сохранения инкапсуляции, сдвоенные типы могут быть также описаны в приватной части расширения.
Концептуальный тип может быть использован как предок для других типов.
Это важно при производстве от сдвоенного типа Human_Sibling, который содержит компоненты другого сдвоенного типа.
Свойства другого сдвоенного типа также доступны для производства через связку To_Human_Sibling.
Содержание Назад Вперед