2

我在理解 Ada 中的继承以及一些语法方面遇到了一些困难。

我的目标是从带有记录的抽象类型派生,并在记录字段中使用不同的数据类型。这是我能够编译的:

type Base is abstract new Parent.ParentType with record
    X:Access_Type;
end record

type Child is new Base with record
    n:Integer;
end record;

但我不想有这个额外的 n 字段,我想让 X 成为子类型中的整数。我无法让编译器对此感到满意。我想要的是以下内容:

type Base is abstract new Parent.ParentType with tagged record
    X:Access_Type;
end record;

type Child is new Base with record
    X:Integer;
end record;

不幸的是,我不知道如何标记我认为允许我重新分配 X 字段的基本类型。(如果没有标记,编译器会抱怨声明冲突。)

有人可以对此有所了解吗?一般来说,我对 OO 编程很陌生,我发现 Ada 的类型方法比通常的类方法更令人困惑。

4

3 回答 3

4

我不确定您要通过更改X派生类型中的类型来解决什么问题。正如Ada 95 Rationale: II.1 Programming by Extension中所建议的那样,标记类型的扩展组件添加到从基类型继承的组件中。您可能正在寻找一种使用判别式为派生类型指定参数的方法。

附录:这可能有助于理解 Ada 对常见的面向对象编程原则的支持不仅限于标记类型。

于 2012-10-13T08:58:02.570 回答
4

你确定你不只是想嵌套一些记录吗?

   type Base is abstract new Parent.Parent_Type with record
      X : Float;
   end record;

...

type child_rec is 
  X : integer;
end record;

...

   type Child is new Bases.Base with record
      C : Child_Rec;
   end record;

这将允许您参考

My_Base.X;

My_Base.C.X;

当然,这也可以在没有任何 OO 特性的情况下完成......

于 2012-10-14T11:28:43.647 回答
3

Base必须被标记,因为你不能说is abstract new Parent.Parent_Type除非Parent.Parent_Type被标记,这意味着任何派生类型,例如Base必须也是。

问题是,正如您所拥有的,任何可以看到的代码都Child可以看到两个Xs;一进Base一进Child。编译器不会让你模棱两可;当其他人阅读您的代码并看到My_Child.X时,他们怎么会知道X您的意思?

解决此问题的一种方法是完整声明Base私有,因此只有一种可见的可能性My_Child.X

package Bases is
   type Base is abstract new Parent.Parent_Type with private;
private
   type Base is abstract new Parent.Parent_Type with record
      X : Float;
   end record;
end Bases;

with Bases;
package Children is
   type Child is new Bases.Base with record
      X : Integer;
   end record;
end Children;
于 2012-10-13T08:56:27.323 回答