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


         

Родственное наследование


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

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

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

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

В терминах типов, такая идея рассматривает концептуальный тип C, производный от двух типов A и B, как множество типов C_A и C_B, соответственно производных от A и B.

Объекты концептуального типа C создаются путем совместной генерации множества объектов типа C_A и типа C_B.

Такие объекты называют родственными объектами (sibling objects) или сдвоенными объектами (twin objects).

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

Они также доступны индивидуально.

Таким образом, легко доступно частичное представление множества, которое соответствует отдельному объекту.

В качестве примера, рассмотрим создание концептуального типа Controlled_Humans, производного от стандартного типа Controlled и типа Human.

Компонент First_Name - это ссылочный тип, а не строка фиксированной длины.

Таким образом, имя может иметь динамически изменяемую длину.

В данном случае используются средства контролируемых объектов для освобождения памяти ассоциируемой с First_Name при разрушении объекта типа Human.

Спецификация типа Human может иметь подобный вид:

package Dynamic_Humanity is

type String_Ptr is access String; type Human is tagged limited

record

First_Name: String_Ptr; end record;

procedure Christen (H: in out Human; N: in String_Ptr); -- устанавливает имя для Human

... end Dynamic_Humanity;

<

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