Ada中的派生类型和子类型

6
什么是差异?

1
这与Prolog有什么关系? - sepp2k
3个回答

9

首先,术语:它的名称是“Ada”,而不是“ADA” - 它是以“Ada Lovelace”命名的;它不是一个首字母缩略词。

子类型与其基类型兼容,因此您可以将基类型的操作数与基类型的操作数混合使用。例如:

subtype Week_Days is Integer range 1..7;

由于这是一个子类型,您可以(例如)将1添加到工作日以获取下一个工作日。

派生类型是完全独立的类型,具有与其基本类型相同的特征。您不能将派生类型的操作数与基本类型的操作数混合使用。例如,如果您使用:

type Week_Day is new Integer range 1..7;

那么你就不能通过将整数加到星期几来得到另一个星期几。要对派生类型进行操作,通常需要自己定义这些操作(例如创建一个包)。同时,派生类型确实“继承”了其基础类型的所有操作(甚至一些可能没有意义的操作),因此仍然可以进行加法操作。


3
我厌倦了解释ADA的事情,现在我只是惯常地编辑任何有错误的问题或答案并进行修正。如果有人想知道原因,他们可以自己查找资料。 - T.E.D.
1
你当然可以将一个星期几加1来得到下一个星期几!但不能使用Integer'(1) - Simon Wright

2

来自Wikibooks

给定类型的子类型彼此兼容。

派生类型是从现有类型创建的新的完整类型。与任何其他类型一样,它与其父类型不兼容;但是,它继承了为父类型定义的原始操作。


1

基本的区别是派生类型是一个不同的类型。你不能只是把一个赋值给另一个,或者在表达式中一起使用他们。而子类型则可以与其原始类型兼容。你可以在不输入任何类型转换代码的情况下将它们一起使用。

子类型的范围比基础类型窄,因此可能会进行范围检查(我相信这可能会引发Constraint_Error)。所以你仍然需要小心。


一个子类型不能具有更广泛的范围,但它可以有相同的范围吗? subtype My_Float is Float; - Simon Wright
是的,它可以具有相同的范围。这是一种常见的“重命名”类型的方式。一个聪明的编译器可能会在这种情况下省略约束检查。在某些情况下,它还应该在循环内部省略约束检查。当然,如果你感觉自己很厉害,你也可以禁用所有约束检查。 - T.E.D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接