好吧,这个问题可能够无聊,反正父类已经实现了,为啥不用父类的一类的问题就不要问了,反正这个事也没啥可争论的,只是告诉大家一种关于接口的写法。
我们都知道 Delphi 中接口对象一般从 TInterfacedObject 继承,但 QueryInterface 函数却不是虚函数,所以想重载是无门的,为此 QPlugins 自己重新实现了 TQInterfacedObject 来替代它。但实际上还有一种办法,可以让你重载它,那就是让你的子类重新继承下父类已经实现的接口(如IInterface),并且实现要重载的函数。示例如下:
type IObject = interface ['{ADB32A65-BACF-462C-8F76-E589A6CE27E9}'] function TypeName: String; end; TTestObject = class(TInterfacedObject, IObject,IInterface) function TypeName: String; public function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; end; procedure TForm2.Button1Click(Sender: TObject); var AObj:IInterface; begin AObj:=TTestObject.Create; ShowMessage((AObj as IObject).TypeName); end; { TTestObject } function TTestObject.QueryInterface(const IID: TGUID; out Obj): HResult; begin if IID=IObject then begin IObject(Obj):=Self; Result:=0; end else Result:=QueryInterface(IID,Obj); end; function TTestObject.TypeName: String; begin Result := ClassName; end;
如果你在 TTestObject.QueryInterface 中设置断点,你会发现竟然能断断断断下来了,证明重载是生效的。而你没有重载的接口函数依然使用父类的实现,而这正是我们要的东西。