我遇到一些困难,让我在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的类型方法比通常的类方法更令人困惑。
答案 0 :(得分:4)
我不确定您尝试通过更改派生类型中X
的类型来解决什么问题。正如Ada 95 Rationale: II.1 Programming by Extension中所建议的,标记类型的扩展将组件添加到从基类型继承的组件。您可能正在寻找一种使用discriminants为派生类型指定参数的方法。
附录:了解Ada对常见object-oriented programming原则的支持并不仅限于标记类型,这可能有所帮助。
The Ada Programming Language: Object-Oriented Programming (OOP)概述了历史观点。在标记类型出现之前,Ada被认为是基于对象的,强烈支持数据抽象,封装,消息传递,模块化和继承;标记类型扩展了对多态性的支持,later additions对该功能进行了改进。
A Comparison of the Object-Oriented Features of Ada 95 and Java提供与(可能)更熟悉的语言的详细比较。
答案 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)
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;