【文件属性】:
文件名称:泛型的实例化-京东应用架构设计
文件大小:7.56MB
文件格式:PDF
更新时间:2024-06-30 04:57:27
Delphi 2010 语法
10.2 泛型的实例化
所谓泛型的实例化是指用一个具体的数据类型作为类型参数的值使得泛型表示一个具
体类型。在本章开头,当我们向 TSample中的 T设置为 String后我们就获得了
TStringSample类型,这个过程称就是一个典型的实例化,将 TSample实化成了
TStringSample。。
在前面我们曾经介绍过多态的概念。程序在运行时会动态的判断对象的实际类型,然
后在调用相应版本的方法,由于这种多态依赖于运行期间的动态类型判断,故而称之为运
行时多态。读者若有疑惑,可复习前面的内容。
与运行时多态不同,实例化是另一种形式的多态,我们称之为编译时多态。以前面的
TSample为例,它可接受多种类型如 Integer、String等类型名并产生相应的版本。不同
于运行时多态,编译时多态并非在运行期间动态判断对象的实际类型。我们在前面说过,
泛型省去了我们编写大量雷同代码的麻烦,但站在编译器角度,泛型非但没有减轻反而加
重了编译器的负担,因为编译器必须代替我们去编写那些雷同的代码。从这个角度来看,
我们使用泛型所得到的轻松是以加剧编译器的负担为代价的。
所以说,泛型实例化的实质是编译器在编译时根据用户的需要自动地编写了多个版本
的代码,然后将这些代码编译并嵌入目标程序中。整个过程中,编译器替我们编写了代
码,其它与一般程序没什么不同。从代码量的角度来看,运行时多态只有一份代码,这份
代码相当于一个全才,无论什么领域的问题都能解决;而编译时多态则有多份代码,其中
的每一份代码相当于一个专才,只能解决自己所在的领域的问题。
从前面一节的例子可以看出,泛型的实例化非常地简单,无论对于哪种泛型在实例化
时只需提供合适的类型名称即可,所以花大量的笔墨来列举各泛型的实例化除了浪费纸张
外没有任何其它意义。鉴于此,本节我们主要介绍的是泛型类在实例化时的一些特殊事项
而并非如何实例化一个泛型。
泛型类的实例化共有四条较为特殊的规则,我们逐条介绍。
规则一,由于实例化发生于编译期间,运行时相当调用了不同的类,所以若在泛型类
中定义一个类变量,不同版本的类变量会保存各自的值。来看一下下面的例子:
type
TFoo = class
class var
FCount: Integer;
constructor Create;
end;
constructor TFoo.Create;
begin
inherited Create;
Inc(FCount);
end;
var
FI: TFoo;
FS: TFoo;