代码之家  ›  专栏  ›  技术社区  ›  onaclov2000

ada中的多类型继承

  •  3
  • onaclov2000  · 技术社区  · 15 年前

    假设我有以下几点:

    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 回复  |  直到 15 年前
        1
  •  4
  •   T.E.D.    15 年前

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

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

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

    这取决于您试图通过使用多重继承来实现什么。在最糟糕(最复杂)的情况下,您通常可以通过“mixin”继承来获得所需的效果。我 以前做过,但我仍然认为在这篇adaic文章中解释得最好: Ada95 and Multiple Inheritance 我自己也做不到。

    以下是摘要:

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

    似乎ada 2005有另一种更简单的方法来实现这一点(“接口”),但我还没有机会尝试。您可以阅读更多关于它的信息(包括为什么Direct 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;
    ...