Original in Russian: http://programmingmindstream.blogspot.ru/2014/04/supports.html
I will not go in for analysis or “spoon-feeding”.
I’ll just give an example.
Just “for your information”.
The code:
Though “it is obvious”. Have a look at the code:
Why do I write?
The reason is, I have seen people who are very amazed by it. (I am not one of them.)
Though... I “pigged out”, too.
I will not go in for analysis or “spoon-feeding”.
I’ll just give an example.
Just “for your information”.
The code:
type ISomeInterface = interface procedure SomeMethod; end;// TA = class(TObject, ISomeInterface {IUnknown is omitted FOR PURPOSE here}) function _AddRef: Integer; function _Release: Integer; function QueryInterface(const anID: TGUID; out anObj): hResult; virtual; procedure SomeMethod; end;//TA TB = class(TA) function QueryInterface(const anID: TGUID; out anObj): hResult; override; end;//TB TC = class(TIntefacedObject, ISomeInterface) procedure SomeMethod; end;//TC ... function TA._AddRef: Integer; begin Result := -1; end; function TA._Release: Integer; begin Result := -1; end; function TA.QueryInterface(const anID: TGUID; out anObj): hResult; begin if Self.GetInterface(anID, anObj) then Result := S_Ok else Result := E_NoInterface; end; procedure TA.SomeMethod; begin Write('A'); end; function TB.QueryInterface(const anID: TGUID; out anObj): hResult; begin if IsEqualGUID(anID, ISomeInterface) then begin Result := S_Ok; ISomeInterface(Obj) := TC.Create; end//IsEqualGUID(anID, ISomeInterface) else Result := inherited QueryInterface(anID, Obj); end; procedure TC.SomeMethod; begin Write('C'); end; ... var l_A : ISomeInterface; l_B : ISomeInterface; begin A := TA.Create; B := TB.Create; if not Supports(A, ISomeInterface, l_A) then Assert(false); l_A.SomeMethod; // - A is seen in console if not Supports(B, ISomeInterface, l_B) then Assert(false); l_B.SomeMethod; // - A is seen in console, and we need C end;
Though “it is obvious”. Have a look at the code:
function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; var LUnknown: IUnknown; begin Result := (Instance <> nil) and ((Instance.GetInterface(IUnknown, LUnknown) and Supports(LUnknown, IID, Intf)) or Instance.GetInterface(IID, Intf)); end;
Why do I write?
The reason is, I have seen people who are very amazed by it. (I am not one of them.)
Though... I “pigged out”, too.
Комментариев нет:
Отправить комментарий