1.普通成员方法需要传如一个隐含的参数:Self指针,即所有的普通的成员方法
都需要一个隐含的实例指针参数.而类方法则不需要这个参数,所以它能脱离实例运行.
比如:
var MyEdit:TEdit;
..
MyEdit := TEdit.Create(nil);
[red]MyEdit.SelectAll;[/red]
编译器会把上一句翻译成大概这个意思:
[blue]TEdit.SelectAll(TEdit(MyEdit));[/blue]
2.Delphi中所有对象实例的前32个字节都会指向这个对象所属类的一个VMT结构.
比如:
var MyEdit1,MyEdit2:TEdit;
...
MyEdit1 := TEdit.Create(self);
MyEdit2 := TEdit.Create(self);
Showmessage(inttostr(Integer((Pointer(MyEdit1))^)));
Showmessage(inttostr(Integer((Pointer(MyEdit2))^)));
你会发现这两个数值相同,它们都指向VMT.(调用一个实例的ClassType类方法也会返回一
个指向VMT的指针)
这个结构中包含着指向方法表的指针,VMT也就可以看作是类本身.VMT的结构在Class单元有定义.
{ Virtual method table entries }
vmtSelfPtr = -76;
vmtIntfTable = -72;
vmtAutoTable = -68;
vmtInitTable = -64;
vmtTypeInfo = -60;
vmtFieldTable = -56;
vmtMethodTable = -52;
vmtDynamicTable = -48;
vmtClassName = -44;
vmtInstanceSize = -40;
vmtParent = -36;
vmtSafeCallException = -32;
vmtAfterConstruction = -28;
vmtBeforeDestruction = -24;
vmtDispatch = -20;
vmtDefaultHandler = -16;
vmtNewInstance = -12;
vmtFreeInstance = -8;
vmtDestroy = -4;
vmtQueryInterface = 0;
vmtAddRef = 4;
vmtRelease = 8;
vmtCreateObject = 12;
3.没有,可以用全局变量代替。