游子日月长

笑渐不闻声渐悄,多情却被无情恼!

导航

Delphi Class of 类引用

Delphi Class of 类引用也就是类的类型,也可说是指向类的指针

Type
TControlCls = Class of TControl;
function CreateComponent(ControlCls: TControlCls): TControl;
begin
result:=ControlCls.Create(Form1);
...
end;

function CreateComponent(ControlCls: TControl): TControl;
begin
result:=ControlCls.Create(Form1);
...
end;

前者要求传入一个类, 而后者要求传入一个对象(类的实例)

type
MyClassRef=calss of CMyClass //表示MyClassRef为指向CMyClass或其父类的指针

类的引用就像指向类的指针一样
类引用就是类的类型,可以声明一个类引用变量赋给它一个类,可以通过这个变量创建对象的实例。

类之类
当你不确定调用的类模型时候用到类之类。
也可以说是类指针~
=============================================
关于class of书上有详细介绍。

引用里面的原话:在程序编译时期,想要利用类别名称或特件来呼叫类别方法。或虚拟建构函式,可是却又不知道类别或物件的真正资料型别,这时候类别参考就非常有用了
=============================================
System单元的TObject有如下方法:
function ClassType: TClass;

它就是获取对象的类类型,它的返回类型TClass就是class of TObject。

因为所有类都派生自TObject,所以所有对象都可以调用ClassType。比如:

procedure TForm1.Button1Click(Sender: TObject);
var
S: TStringList;
C: TClass;
begin
S := TStringList.Create;

C := S.ClassType;
ShowMessage(C.ClassName);//对话框会显示出来TStringList,相当于TStringList.ClassName

S.Free
end;


而C.ClassName调用的是TObject的类方法ClassName,
原型:class function ClassName: ShortString;

就是说不需要用实例化的对象去调用,直接用类去调用就行了;不过用对象调用也是可以的,因为对象空间也保存了类的VMT地址。

用类调用形如:TStringList.ClassName
用对象调用形如:S.ClassName
=============================================
这段书上的话估计翻译自Delphi的帮助文档:
Class-reference types are useful when you want to invoke a class method or virtual constructor on a class or object whose actual type is unknown at compile time.
我上次翻译成这样了,应当不对:
类引用类型是有用的,当你想调用一个“类方法”或当你想调用在编译时期实际类型未知的一个类或对象的虚构造器的时候。
============================================
我是这样理解的
类引用 : class of 相当于一种类型的类; 不需要创建实例;就可以直接调用;运行时期实际类型未知的类 时;
类的方法 : class function 在实例化前就可以直接调用(不在private区域)

var
List: TStrings;
i: Integer;
begin
List := TStringList.Create;
for i := 0 to 99 do
List.Add(IntToStr(i));
Memo1.Lines := List;
List.Free;
end;

{
TStrings 类中包含了抽象方法, 但这些抽象方法在其子类 TStringList 中都得到了实现; 因此, 我们虽然定义的是 TStrings 类的变量, 却要通过 TStringList 来实现.
这里就有个问题, 我们直接使用 TStringList 不行吗? 为什么还要绕个弯?
我觉得是: 这样才更符合"多态"的思想吧;
仅就本例而言 Memo1.Lines 本身就是 TStrings 类型的, 这样可以避免类型冲突. 举例说明:
}

============================================
类的类,让程序可以动态切换类
没有它,程序只可以动态切换对象

posted on 2017-02-14 09:15  游子日月长  阅读(526)  评论(0编辑  收藏  举报