IInterface =interface ['{00000000-0000-0000-C000-000000000046}'] function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end;
TA =class(TInterfacedObject, IA) end; TB =class(TInterfacedObject, IB) end;
那么你还会发现,IA(b)得到的接口和b as IA得到的接口不是同一个接口啊。下面这段代码可以验证:
type IA =interface ['{CDDE945F-BD5C-49B4-AF21-945460782C62}'] procedure A; end; IB =interface(IA) ['{BE689474-2621-4BB0-BB1B-F77E6D557560}'] procedure B; end; TA =class(TInterfacedObject, IA) procedure A; end; TB =class(TA, IB) procedure B; end; ...{ TB } procedure TB.B; begin end; ...{ TA } procedure TA.A; begin end; procedure TForm1.Button1Click(Sender: TObject); var a: IA; b: IB; begin b := TB.Create; ShowMessage(IntToStr(Integer(b))); a := IA(b); ShowMessage(IntToStr(Integer(a))); a := b as IA; ShowMessage(IntToStr(Integer(a))); end;