“类的引用”如何理解?(50分)

  • 主题发起人 主题发起人 renrf
  • 开始时间 开始时间
R

renrf

Unregistered / Unconfirmed
GUEST, unregistred user!
书中写到:
--------------------
类的引用是一种类型,它不是对对象的引用,也不是对类的引用,
而是对类的类型的引用。类的引用类型定义了引用变量的类型。
假设用户定义了一个类:

type
CMyClass=class
...
end
下面定义一个新类的引用类型,与下面的类相关:
type
MyClassRef=calss of CMyClass
这样就声明了两个类型的变量:
aClassRef:MyClassRef;
aObject:CMyClass;
其中第一个变量引用一个对象,第二个引用类:
aClassRef=CMyClass;
aObject=CMyClass.Create;
--------------------
这一段我看不明白,请各位解释一下。谢谢
 
另外举一个例子吧,比如我可以写一个函数
type TControlClass = class of TControl;
procedure insert_control(cls:TControlClass);
begin
obj;=cls.Create(Application);
把obj放进form
end;

调用的时候,如果是 insert_control(TEdit) 那么放进form的是一个编辑框
如果是 insert_control(TButton) 那么放进form的是一个按钮
谢复杂一点就是
var ctl:TControlClass;
ctr:=TEdit;
insert_control(ctl)
------------------------------
注意上面我们用到TButton和TEdit它们都有共同的祖先TControl
我们定义一个基类,然后通过传递不同的子类,那么一个函数只写一次就实现不同的效果
 
类引用的用途就是创建在编译器无法确定的对象,举个列子:

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

调用时如:

CreateComponent(TMemo);//创建TMemo对象
CreateComponent(TEdit);//创建TEdit对象

 
谢谢,
我书上的例子怎样理解呢?
 
你书上的例子就更简单了,根本没讲到实际的用途
就是出现aClassRef的地方你把它看成CMyClass好了
 
提前提前,我还没看明
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;

上面这两个东东的结果不是一样吗?有会什么差别??我只注重结果
 
当然不同了
 
to testnet:
将你的两个函数名分别改为 CreateComponent1 和 CreateComponent2
你象这样编译一下:
CreateComponent1(TEdit);
CreateComponent2(TEdit);
看出 结果 上的差别了吧?
 
前者要求传入一个 类, 而后者要求传入一个 对象(类的实例)
 
前一个函数将创建你传入的类的一个实例,而后一个函数,没有意义吧.
 
上面都说得较清楚了,
type
MyClassRef=calss of CMyClass //表示MyClassRef为指向CMyClass或其父类的指针.
 
类的引用就像指向类的指针一样
 
这个特性不错
 
没有说清楚![:D]
准确的说,这是一种编译器提供的原始二次识别的方法.
"我定义很多的类,当然,他们是一个系统的,然后,我把它们统统成为某某类,
当你需要某个类或者类的实例(通常是后者)的时候,你就告诉我那个类的名称,
然后,我就给你那个类,或者类的实例"其实这也不清楚,在后面,
"你是一个猪,猪类,他是一个马,马类,我是一个头人,人类,"
好了,"我们这些类都统统称为动物类"(实际生活中有动物类吗[?]没有!
都是抽象出来的概念)那么,动物类的实例我们称为某个动物,
现在,屠宰场要买一个动物,好!到底是要一个猪呢,还是一个马吗[?]反正不会是一头人啦.
这样,我们送去一个猪类或者马类(记住,这是类型),不管如何,屠宰场就会得到一个动物.
最后,某个人类的实例就有得吃了[:D]
好好想想,然后对照下面,
Type
TControlCls = Class of TControl;
function CreateComponent(ControlCls: TControlCls): TControl;
//这里是在问"你是给我送个马类还是猪类呢[?]"
//结果呢,下面的代码送了一个窗口类[:)]
begin
result:=ControlCls.Create(Form1);
...
end;
function CreateComponent(ControlCls: TControl): TControl;
//在问,你要那一个猪[?]
//答:我要窗口1的那个猪[^]
begin
result:=ControlCls.Create(Form1);
...
end;
好了,这下没有明白的话,那真是猪.[:)]
[:(!][:(!]声明,千万不要误会,我没有骂人,我想这样说,您的印象非常之深刻,更好理解.
 
1:从语义学角度讲,类引用是 type of type
类所属的类型,从语义方面考虑,任何进行语法检查的符号都必须有类型
但是至于为什么,类引用不属于任何类型,是为了更加类型系统更加健壮。
这么说,可能大家有些胡涂。继续讲下去,就必须深入类型论了,有兴趣
的可以参看一些语义学方面的书。

2:从编译器角度看,类引用是指向类虚函数表的引用(reference)也可以理解为
指向类虚函数表的指针。
 
后退
顶部