2010-03-03 2 views
3

Пусть у меня есть следующие:Multiple Тип наследования в Аде

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

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

UPDATE:

было бы возможно ссылки на элементы blah3 (содержащие бла и blah2) с помощью указателей?

I.E. (Это просто грубая идея код ужасен ... LOL)

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

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

+2

Короче говоря, нет множественного наследования в Ada не так, как вы надеетесь. Близкие аналоги возможны с использованием «mixins» и наследования интерфейсов, но я не много сделал в этих областях, поэтому я не хочу давать советы, не имея опыта для его резервного копирования (не то, что останавливает большинство блоггеров :-). В чем проблема, которую вы пытаетесь решить? Возможно, есть хорошее решение, которое не связано с МИ. –

+0

Я дам ему выстрел ... –

+0

Цель состоит в том, чтобы сохранить «пакет» черного цвета, I.E. запись Blah 3 является типичным «звонком» на наш пакет, но определенные события привели к тому, что данные мы должны быть размещены в двух разных типах, надежда состояла в том, чтобы каким-то образом объединить их, поэтому мы можем оставить первый вызов в одиночку, и это будет все еще работаю за внешними людьми, пытающимися позвонить. - Надеюсь, это имело смысл. – onaclov2000

ответ

4

Marc C является правильным (как обычно).

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

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

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

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

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

Похоже, что у Ada 2005 есть еще один простой способ сделать это («интерфейсы»), но у меня еще не было возможности попробовать это. Вы можете узнать больше об этом (в том числе, почему прямой MI еще считается плохой в Аде) here. Я нашел этот пример. Опять же, это будет работать только в том случае, если ваш компилятор поддерживает 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; 
... 
+0

К сожалению, Ada - 95, я считаю, мы не можем пойти на 2005 год .... – onaclov2000

+0

Я думаю, что вам нужно идти по маршруту mixin. Я видел презентацию на ней * лет назад, и она была довольно гладкой. –

+0

Затем прочитайте первую связанную статью. Он был написан отцом Ada95 и подробно рассказывает о том, как сделать с ним наследование mixin (с примерами). –

Смежные вопросы