如何从抽象标记记录中设置和派生类型?

时间:2012-10-13 03:10:22

标签: ada

我遇到一些困难,让我在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的类型方法比通常的类方法更令人困惑。

3 个答案:

答案 0 :(得分:4)

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

附录:了解Ada对常见object-oriented programming原则的支持并不仅限于标记类型,这可能有所帮助。

答案 1 :(得分: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功能的情况下完成....

答案 2 :(得分:3)

必须对{p> Base进行标记,因为除非is abstract new Parent.Parent_Type被标记,否则您无法说Parent.Parent_Type,这意味着任何衍生类型(例如Base)也必须

问题在于,正如您所看到的,任何可以看到Child的代码都可以看到两个X; 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;