Ada中的多类型继承

时间:2010-03-03 17:19:13

标签: 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.element1和blah3.element2

这可能吗?以及任何提示或提示?

更新:

是否可以使用指针引用blah3(包含blah和blah2)的元素?

即。 (这只是一个粗略的想法代码很可怕......大声笑)

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

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

1 个答案:

答案 0 :(得分:4)

Marc C是对的(和往常一样)。

直接多重继承即使在支持它的语言中也是非常矛盾的。关于编译器在某些边缘情况下应该做什么有很大的问题,例如当两个父类定义相同方法或成员的不同版本时。当Ada95添加继承时,它明确

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

这取决于您尝试使用多重继承实现的目标。在最糟糕(最复杂)的情况下,您通常可以通过“mixin”继承来实现您正在寻找的效果。我之前已经完成了它,但我认为在这篇AdaIC文章中解释得最好:Ada95 and Multiple Inheritance比我自己做的更好。

这是摘要:

  

Ada 95支持多重继承   模块包含(通过多个   “with”/“use”子句),   多重继承   通过私人“实施 - 使用”   扩展和记录组成,和   多重继承混合通过   使用泛型,正式包和   访问判别。

似乎Ada 2005有另一种更简单的方法(“接口”),但我还没有机会尝试。您可以阅读更多相关信息(包括为什么直接MI 仍然在Ada中被视为不良)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;
...