Types Ada中的多类型继承

Types Ada中的多类型继承,types,polymorphism,multiple-inheritance,ada,Types,Polymorphism,Multiple Inheritance,Ada,假设我有以下几点: 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.el

假设我有以下几点:

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)的元素

(这只是一个粗略的想法代码很糟糕…哈哈)

然后可以通过 例如blah3.element1?

Marc是正确的(像往常一样)

直接多重继承即使在支持它的语言中也是非常有争议的。在某些边缘情况下,编译器应该做什么有很大的问题,比如当两个父类定义同一方法或成员的不同版本时。在Ada95中添加继承时,显式地不允许

所以你的下一个问题是“我怎么做我想做的事?”

这取决于您试图通过使用多重继承来实现什么。在最糟糕(最复杂)的情况下,您通常可以通过“mixin”继承实现您想要的效果。我以前做过,但我仍然认为这篇文章最好地解释了这一点:比我自己能做的还多

以下是一篇摘要:

Ada95支持多重继承 模块包含(通过多个 “带”/“使用”条款), 多重继承 使用“通过私有”实现 扩展和记录合成,以及 通过 使用泛型、正式包和 访问歧视

ADA2005似乎有另一种更简单的方法(“接口”),但我还没有机会尝试。您可以阅读更多关于它的内容(包括为什么直接MI在Ada中仍然被认为是不好的)。我找到了这个例子。同样,这只有在编译器支持ADA2005时才有效

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;
...

简言之,不,多重继承在Ada中是不可能以您希望的方式实现的。使用“mixin”和接口继承可以实现类似的功能,但我在这些方面做得不多,所以我不想在没有经验支持的情况下给出建议(这并不能阻止大多数博客作者:-)。你想解决的问题是什么?也许有一个好的解决方案不涉及MI。目标是保持一个特殊的“包”黑盒,即记录blah3是我们包的典型“调用”,但某些事件导致我们必须将数据放在两种不同的类型中,希望以某种方式将它们统一起来,所以我们可以不去管最初的电话,它仍然适用于试图打电话进来的外部人员。--我希望这是有意义的。我认为你必须走mixin路线。几年前我看过一个关于它的演示,它非常流畅。我想我们首先要尝试“更新”的方法,看看它是否有效,如果无效,那么我想mixin将不得不作为替代方法,感谢所有的帮助!
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;
...