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 类型的, 这样可以避免类型冲突. 举例说明:
}
============================================
类的类,让程序可以动态切换类
没有它,程序只可以动态切换对象
Delphi Class of 类引用的更多相关文章
- Delphi 类引用 Class Reference 元类 MetaClass 用法
delphi中类引用的使用实例 类引用类引用(Class Reference)是一种数据类型,有时又称为元类(MetaClass),是类的类型的引用.类引用的定义形式如下: class of type ...
- Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用
Delphi 正则表达式语法(8): 引用子表达式 - 也叫反向引用 //准备: 我们先写一个搜索所有英文单词的表达式 var reg: TPerlRegEx; begin reg := TP ...
- 转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...
- 学习笔记: Delphi之线程类TThread
新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...
- 谈谈Delphi中的类和对象3---抽象类和它的实例
四.抽象类和它的实例 Delphi中有一个类称为是抽象类,你不能天真的直接为它创建一个实例,如 var StrLst: TString; begin StrLst:= TString.Create; ...
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- Android 非Activity类引用getResources()方法问题的解决方法
在进行Android开发的过程中,在一个非Activity类(此处假设类名为MyNewClass)中引用了getResources()方法,如下: Bitmap bmp = BitmapFactory ...
- as3 文档类引用
/**文档类引用**/ public static var main:CoverMain; public function CoverMain() { main=this; }
- python list类型的变量相当于全局变量 可以被函数与类引用
python list类型的变量相当于全局变量 可以被函数与类引用
随机推荐
- 工作T-SQL备忘
作为一个"浸淫" Oracle 数据库很久的人来说, 突然转入 T-SQL, 也就是 MSSQL , 工作中经常用的查询和 MSMS 使用备忘如下 : --1. 切换对应的库连接 ...
- Spring MVC 处理异常
SpringMVC处理异常: 1 使用@ExceptionHandler注解 只有ModelAndView可以携带错误信息 @ExceptionHandler public ModelAndView ...
- javascript-table出现滚动条表格自动对齐
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Wsgi的web框架实例
建立server服务端: from wsgiref.simple_server import make_server import time def f1(request): return [b'&l ...
- int 操作
int类型只能进行 + - * / % // ** # bit_length() 二进制长度
- Maven环境变量
Windows: M2_HOME=D:\ProgramFiles\apache-maven-3.5.0M2_REPO=D:\ProgramFiles\maven\repositoryPATH=%PAT ...
- 精通Web Analytics 2.0 (13) 第十一章:变身分析忍者的指导原则
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第十一章:变身分析忍者的指导原则 这个激动人心的一章,分析了几乎所有工作的各个方面. 目标很简单:使用成熟的方法来帮助避免淹死的 ...
- ClientAbortException: java.net.SocketException: 断开的管道
这次终于解决了 ClientAbortException ! [ERROR] [- ::] net.jweb.actions.CommonDiskAction - 系统异常 ClientAbortEx ...
- nohup top & 问题: top: failed tty get
执行 nohup top & nohup.out 显示 top: failed tty get +++++++++++++++++ top后台执行显示:top: failed tty get ...
- 3. group_concat与oracle中wm_concat用法一样
例子如下: select group_concat(rp.ROLE_ID) from eic_right_role_operator rp where rp.OPERATOR_ID = #id#