2010-03-03 157 views
3

假設我有以下幾點:多種類型的繼承

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

阿達總之這隻會工作,不,多重繼承是不可能的阿達在您希望的方式。使用「mixins」和接口繼承可能會產生類似的結果,但在這些領域我沒有做太多工作,所以我不想提供沒有經驗的建議來支持它(但這不會阻止大多數博客:-)。 你試圖解決什麼問題?也許有一個不涉及MI的好方案。 – 2010-03-03 17:56:44

+0

我會給它一個鏡頭... – 2010-03-03 20:22:53

+0

目標是保持一個特殊的「包裝」黑盒裝,I.E. Blah 3是對我們軟件包的典型「呼叫」,但某些事件導致我們必須將數據分爲兩種不同的類型,希望以某種方式統一這些數據,因此我們可以單獨保留最初的呼叫,仍然爲外部人試圖打電話。 - 我希望這是有道理的。 – onaclov2000 2010-03-03 22:13:18

回答

4

馬克C是正確的(像往常一樣)。

直接即使在支持它的語言中,多重繼承也是非常矛盾的。關於編譯器在某些邊緣情況下應該做什麼存在很大的問題,例如當兩個父類定義相同方法或成員的不同版本時。 Ada95在添加繼承時明確允許而不是

所以你的下一個問題將是「那麼我該怎麼做我想做的事情?」

這取決於你想通過使用多重繼承來實現什麼。在最糟糕的情況下(最複雜的情​​況),您通常可以通過「mixin」繼承實現您正在尋找的效果。我之前做過,但我仍然認爲這是在這篇AdaIC文章中最好的解釋:Ada95 and Multiple Inheritance比我自己能做的更好。

這裏的一個摘要:

阿達95支持多繼承 模塊包容(經由多個 「與」/ 「使用」 條款), 多重繼承 「時實現的-使用」 通過私有 擴展和記錄組成,以及 通過 使用泛型,正式包和 訪問判別式的多重繼承混用。

看來,Ada 2005有另一種更簡單的方法來做到這一點(「接口」),但我還沒有機會嘗試。你可以閱讀更多關於它(包括爲什麼直接MI是仍然認爲在Ada壞)here。我找到了這個例子。同樣,如果你的編譯器支持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

不幸的是,阿達是95我相信,我們不能去2005 .... – onaclov2000 2010-03-03 22:11:54

+0

我認爲你必須去mixin路線然後。我在*年前看到了一個演示文稿,它非常漂亮。 – 2010-03-03 23:01:43

+0

然後閱讀第一篇鏈接的文章。它由Ada95的父親撰寫,並詳細介紹瞭如何對mixin進行混合(帶有例子)。 – 2010-03-04 14:23:14