Ada 的 T'Class 基础知识

Fundamentals of Ada's T'Class

问这个有点尴尬,但我知道这是最好的。我已经使用 Ada 编程很多年了,几乎能流利地理解这门语言的每一部分。然而,我似乎从来没有想过 T'Class。向别人借钱,谁能"explain it like I'm five?".

编辑:我买它只是为了拥有,但其中包含对 T'Class 的很好描述和示例使用;我参考了 Michael B. Feldman 的“Software Construction and Data Structures with Ada 95”

好吧,如果你是五岁,我会说T'Class代表T的整个家庭。 对于家庭,我们指的是 children 和 grand-children 以及祖父 grand-children。

因为你不是五,这意味着这个特殊类型代表了 T 的继承树中的每个标记类型。这样,如果你使用这个类型作为参数,你可以使用每个具有T 是否直接作为祖先。 更多信息,您可以阅读the wikibooks on this.

如果您从

开始
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,或调用另一个覆盖 Method。

基本上:使用'Class,事情在运行时解决。