2007年02月02日

刚拜读了CSDN上的一篇文章:《苛求VCL:不满意TObject的设计》,原文中说“对象指针和接口指针并不是同一个地址”,这句话没有交代明白,同一个对象实例,怎么可能不是同一个地址呢,这一点解释不通,事实上,做个简单的实验,发现对象指针和指口指针肯定是同一个地址。新建一个工程,在Form上放一个Memo控件:

type  IFoo = interface    procedure Execute;  end;

  TFoo = class(TInterfacedObject, IFoo)    procedure Execute;    procedure MyMethod;  end;

procedure Test(AFoo: IFoo);begin  AFoo.Execute;end;

procedure TForm1.FormCreate(Sender: TObject);var  intf: IFoo;  obj: TFoo;begin  obj := TFoo.Create;  obj.Execute;  intf := obj;  intf.Execute;  Test(obj);  Test(intf);end;

procedure TFoo.Execute;begin  Form1.Memo1.Lines.Add(Format('this=%d', [Integer(Self)]));end;

结果当然是地址都相同。

这段代码还说明了从对象转换到接口是很轻松的事情,连AS都不用(上面Test过程要求一个接口,由于obj这个对象实例实现了该接口,所以直接传递就可以了)。

至于原文中所说的“如何从接口转换到对象”,首先想到的是为什么要把接口转换到对象?动机是什么?通常,编程是基于抽象,用接口的目的就是为了让上层不必了解底层细节,将派生类看生基类是很自然的做法,反过来把基类向下强制转换为派生类就很费解了。

如果非要这么做,当且仅当你知道intf实现就是TFoo时,你可以用一个强制类型转换:

TFoo(intf).MyMethod;