• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

DelphiClassof类引用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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 类型的, 这样可以避免类型冲突. 举例说明:
}

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap