Ada中的多类型继承

4
假设我有以下内容:
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)的元素?

例如:(这只是一个粗略的代码想法...LOL)

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

并且它们可以通过blah3.element1进行访问,例如?

2
简而言之,不,Ada不能以你所希望的方式实现多重继承。使用“mixin”和接口继承可以实现类似的功能,但我在这些领域并没有做过太多工作,所以我不想给出没有经验支持的建议(尽管这并不能阻止大多数博客作者 :-)。你试图解决什么问题?也许有一个不涉及MI的好解决方案。 - Marc C
目标是保持特定的“包”黑盒化,即记录Blah 3是我们包的典型“调用”,但某些事件导致我们拥有的数据被分为两种不同类型,希望以某种方式统一这些数据,这样我们就可以保持初始调用不变,并且对于试图调用的外部人员仍然有效。--我希望这讲得清楚。 - onaclov2000
1个回答

5

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

直接多重继承甚至在支持它的语言中也备受争议。存在一些大问题,例如当父类都定义了不同版本的相同方法或成员时,编译器应该做什么,在某些边缘情况下。当他们添加继承时,Ada95明确禁止使用它。

那么你的下一个问题将是“那我该怎么做?”

这取决于您尝试使用多重继承实现什么目标。在最坏(最复杂)的情况下,您通常可以通过“mixin”继承实现您要查找的效果。我以前做过,但我认为这篇AdaIC文章解释得最好:Ada95 and Multiple Inheritance

以下是摘要:

Ada 95支持多重继承模块包含(通过多个“with”/“use”子句),多重继承“使用”通过私有扩展和记录组合,以及多重继承混合通过使用泛型、形式包和访问辨别标志。

看起来,Ada 2005有另一种更简单的方法来实现这一点(“接口”),但我还没有机会尝试过。您可以在这里阅读更多信息(包括为什么直接MI在Ada中仍被认为是不好的)。我找到了这个例子。同样,只有当您的编译器支持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;
...

我认为你必须走mixin的路线。我几年前看过一个关于它的演示,非常流畅。 - Marc C
我认为我们将首先尝试“更新”的方法,只是为了看看它是否有效,如果不行,那么我认为混合将成为替代方案。感谢所有的帮助! - onaclov2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接