Наследование нескольких типов в Аде - PullRequest
3 голосов
/ 03 марта 2010

Предположим, у меня есть следующее:

type blah is abstract tagged 
record 
element1 : integer; 
end record;

type blah2 is abstract tagged
record
element2 : integer;
end record;

Я надеюсь, что возможно, что я могу сделать что-то вроде этого:

type blah3 is abstract new blah1 and blah 2 with null record;

Так что теоретически я могу теперь получить доступ к blah3.element1 и blah3.element2

Возможно ли это?и какие-либо советы или подсказки?

ОБНОВЛЕНИЕ:

Можно ли ссылаться на элементы blah3 (содержащие blah и blah2), используя указатели?

IE (это простогрубый код идеи ужасен ... LOL)

type blah3 is new type with
record
element1 : ptr to blah.element1;
element2 : ptr to blah2.element2;
end record

, и тогда к ним можно получить доступ, например, через blah3.element1?

1 Ответ

4 голосов
/ 03 марта 2010

Марк С прав (как обычно).

Прямое множественное наследование очень противоречиво даже в тех языках, которые его поддерживают. Существуют большие проблемы с тем, что компилятор должен делать в некоторых крайних случаях, например, когда оба родительских класса определяют разные версии одного и того же метода или члена. Это было явно не разрешено в Ada95, когда они добавили наследование.

Итак, ваш следующий вопрос будет «Так как мне делать то, что я хочу делать?»

Это зависит от того, чего вы пытаетесь достичь, используя множественное наследование. В наихудшем (наиболее сложном) случае вы обычно можете добиться нужного эффекта с помощью наследования «mixin». Я уже делал это раньше, но все же я думаю, что это лучше объяснено в этой статье AdaIC: Ada95 и множественное наследование , чем я мог бы сделать сам.

Вот дайджест:

Ада 95 поддерживает множественное наследование включение модуля (через несколько предложения "with" / "use"), множественное наследование "реализовано-используя" через приват расширения и состав записи, и множественные наследования через использование дженериков, формальных пакетов и дискриминанты доступа.

Похоже, что у Ada 2005 есть другой более простой способ сделать это ("интерфейсы"), но у меня еще не было возможности попробовать это. Вы можете прочитать больше об этом (в том числе, почему прямой MI все еще считается плохим в Аде) здесь . Я нашел этот пример. Опять же, это будет работать только если ваш компилятор поддерживает Ada 2005

Interfaces can be composed from other interfaces thus 
type Int2 is interface;
...
type Int3 is interface and Int1;
...
type Int4 is interface and Int1 and Int2;
...
...