Delphi中可以声明一种特殊的类型叫做类类型,它记录了一个类的类型信息,声明这种类型的方式如下:
Type AClassType=class of AType;
其中,AType可以是任何类型,但经常为某个类,声明这样的一个类型的变量,则这个变量就能够记录这个类型或其子类型的类型信息,例如有这样的一个声明:
TypeClass=class of TObject;
AnyClass:TypeClass;
这样,变量就可以赋予任何的类型信息,因为delphi中一切的类都是TObject的子类,TObject 有一系列方法用于类类型操作,例如ClassName等方法.
下面是一个例子:
在窗体上我们随意放置了几个组件,它们的OnClick事件是相同的:
procedure TForm1.Button1Click(Sender: TObject);
var AClass:TClass;
begin
AClass:=sender.ClassType;
Label3.Caption:=AClass.ClassName;
AClass:=sender.ClassParent;
Label5.Caption:=AClass.ClassName;
end;
这里我们使用了一个类TClass,这是在system单元中定义的一个类,它的定义与我们上边的定义(class of TObject)是相同的。程序运行我们可以看到对象的类型名称和f父类的类型名称,这就是类类型的典型用法,即运行时确定类型信息。给予类类型上的操作就是is和as两个了。
我们还可以在类中声明类方法,声明类方法的直接结果就是,当声明了这个类的类型后可以在类类型变量的成员中发现它,例如TObject 的若干方法。下面我们来看一个例子:
TChild=class(TObject)
class function IsAChildOfTObject:boolean;
end;
ChildClass=class of TChild;
class function TChild.IsAChildOfTObject:boolean;
begin
result:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var AChildClass:ChildClass;
begin
If AChildClass.IsAChildOfTObject then
Label1.Caption:='true';
end;
声明类方法,必须使用保留字class,同时在实现时也必须加上class保留字,需要注意的是,类方法也可以当作对象方法使用,这时,对象的self的类型信息值将作为类型值传递。
例如上面的
procedure TForm1.Button1Click(Sender: TObject);
var AChild:TChild;
begin
AChild:=TChild.Create;
If AChild.IsAChildOfTObject then
Label1.Caption:='true';
end;
将得到同样的结果.
类类型的主要使用方法是就是作为参数传递,这在vcl源代码中是很常见的.