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,事情在运行时解决。
问这个有点尴尬,但我知道这是最好的。我已经使用 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,事情在运行时解决。