有点尴尬地问这个,但我知道这是最好的。我已经在Ada编程多年了,并且能够流利地理解语言的几乎所有部分。但是,我似乎永远无法绕过T'Class。借用别人,有人可以“像我五岁那样解释它吗?”。
编辑:我买它只是为了拥有,但其中包含了对T'Class的一个很好的描述和示例使用;我指的是Michael B. Feldman撰写的“Ada 95的软件构建和数据结构”。
答案 0 :(得分:5)
如果你从
开始package P1 is
type T is tagged private;
procedure Method (Self : T);
end P1;
package P2 is
procedure Proc (Self : T); -- not a primitive
procedure Proc2 (Self : T'Class);
end P2;
在Proc的情况下,您告诉编译器该参数应始终被视为类型T的精确考虑(请记住,标记类型始终通过引用传递,因此实际类型可以从T派生,当然,你不会失去额外的数据)。特别是,这意味着在Proc的主体内,对Method的所有调用都将完全调用P1.Method,而不是调用重写方法。
对于Proc2,您告诉编译器您不能静态地知道确切的类型,因此需要在运行时插入额外的代码来解决问题。在Proc2的主体内调用Method,可以调用P1.Method,或者调用另一个重写方法。
基本上:使用'Class,在运行时解决问题。
答案 1 :(得分:2)
好吧,如果你五岁,我会说T' Class代表整个T家族。 按家庭分类,我们指的是儿童,幼儿和曾孙子。
由于您不是五,这意味着此特殊类型表示T的继承树中的每个标记类型。这样,如果您使用此类型作为参数,则可以使用每个参数T直接或不是祖先。 有关详细信息,请参阅the wikibooks on this。