【问题标题】:Multiple Type Inheritance in AdaAda 中的多类型继承
【发布时间】:2010-03-03 17:19:12
【问题描述】:

假设我有以下内容:

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)?

I.E. (这只是一个粗略的想法,代码很糟糕......哈哈)

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

然后就可以通过 以 blah3.element1 为例?

【问题讨论】:

  • 简而言之,不,在 Ada 中不可能以您希望的方式进行多重继承。使用“mixins”和接口继承可以实现近似的类似物,但我在这些领域做得不多,所以我不想提供没有经验的建议来支持它(这并不是阻止大多数博主:-)。您要解决的问题是什么?也许有一个不涉及 MI 的好解决方案。
  • 目标是保持一个特定的“包”黑盒,即记录 Blah 3 是对我们包的典型“调用”,但某些事件导致我们必须将数据放入两种不同类型,希望以某种方式统一它们,所以我们可以不理会最初的调用,它会仍然为试图打电话的外部人员工作。-我希望这是有道理的。

标签: types polymorphism multiple-inheritance ada


【解决方案1】:

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

【讨论】:

  • 我认为你必须走 mixin 路线。 年前 之前我看过一个关于它的演示文稿,它非常漂亮。
  • 我想我们会先尝试“更新”的方法,看看它是否有效,如果没有,那么我认为 mixin 将成为替代方案,感谢所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多