1、你那本书应该说错了。TABC是指向TObject类型的指针,即TABC可以代表Delphi中任意类的类型。
使用方法
var
a: TABC;
b: TObject; a = TList;
b := a.Create;2、class method相当于C++中的static函数。所以无论对象实例是否创建。
使用方法
var
a: TABC;
b: TObject; a = TList;
b := a.Create;2、class method相当于C++中的static函数。所以无论对象实例是否创建。
1.var
a: TABC;
b: TObject; a = TList;
b := a.Create;
您的意思是不是代表a是百变金刚,只要它指向的是TObject或Tobject的派生类,都可以转换可以利用as操作,请指点
2."class method相当于C++中的static函数。所以无论对象实例是否创建。" 这个我是知道的,但是我想知道,比如我要自己创建一个类,写方法时,什么该用类方法,什么用对象方法
2、这个情况和你在C++碰到的情况一样。一般来说,静态方法很少定义,而且不能使用类中的其它成员变量和方法(静态方法除外)。
看源码时可以看到对于TObject的ClassName类方法
class function TObject.ClassName: ShortString;
begin
Result := PShortString(PPointer(Integer(Self) + vmtClassName)^)^;
end;而如果用普通的对象方法,假如在TForm1中则需要
function TForm1.ClassNameSecond: ShortString;
begin
Result := PShortString(PPointer(Integer(Pointer(Self)^) + vmtClassName)^)^;
end;也就是说在类方法中的Self即为指向该类型的指针,指向了一个VMT表格,里面包含了许多有关于
该类信息的入口
而在普通得对象方法中,Self就为指向该对象实例的指针,而开头的四个字节中存放的是才是指向
该类类型的指针
这是我的一点理解,不知对否
但Borland的那些天才程序员为什么要创造TABC这种类类型指针呢,只是为了灵活吗?
请大家积极讨论,分不够可以再加,up也给分.
一个大家常用的例子
Application.CreateForm(TForm1, Form1);
其中第一个参数就是类型指针。
类方法应该就是向您所说的.
正象chechy老大说的那样
近日正在看<<delphi高级开发指南>>
中的RTTI的一章,对于取得一个类的类型信息,ClassInfo这个方法就很总要了,它就是这个
类的类型信息的入口点,另外Delphi的类型系统需要保存一份在各种情况下如何构建给定类型
的完整描述,也就是这个类指针, 以前看书好像看到过,但你拖一个控件放在窗体上时
delphi会自动为你注册上也就是调用RegisterClass,当Delphi读取dfm文件时,会用GetClass
来取得这个类指针,看一下TReader的ReadComponent就会了解,对于我们实际用处方面,象<<Delphi5开发人员指南>>有一节就是把窗体做在包中,并在Initialization用RegisterClass注册上,
然后作为一个包装的窗体用FindClass找到在创建,这样就把程序分成了各个包,也大大增加了
程序的扩展性
TfraBase = class(TFrame)
,然后从fraBase继承若干frame:
TfraPlan = class(TfraBase)
TfraInut = class(TfraBase)
TfraSet = class(TfraBase)各个Frame需要切换,如果没有用类中类的话,就需要:var fraMain:TfraBase;
Case Flag of
1:fraMain := TfraInut.Create(self);
2:fraMain := TfraSet.Create(self);
...
end;用类中类的话:
TXFrameClass = class of TFrame;
procedure ShowActiveFrame(var fraMain:Tframe;fraClass:TXFrameClass)
begin
fraMain:=fraClass.Create(Self);
end;调用:
ShowActiveFrame(fraMain,TfraPlan);
type
Form1Class= class of TForm1;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
class function Execute(formtype:form1class;AOwner: TComponent): integer; virtual;
{ Public declarations }
end; TForm2 = class(TForm1)
public
constructor Create(AOwner: TComponent); override;
end;
var
Form1: TForm1;implementation{$R *.DFM}//产生什么类型的窗体,就把他的类名传进去.
class function TForm1.Execute(formtype:form1class;AOwner: TComponent): integer;
var
Form: TForm1;
begin
Form := formtype.Create(AOwner); //这里如何调用TForm1的子类?
with Form do
try
ShowModal;
finally
Release;
end;
end;//显示form2
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Execute(tform2,Self) ;
end;{ TForm2 }constructor TForm2.Create(AOwner: TComponent);
begin
inherited;
caption:='form2';
end;//显示form1
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Execute(tform1,Self) ;
end;