Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.111 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Zur Laufzeit entscheiden ob ein Interface implementiert wird oder nicht

  Alt 9. Dez 2019, 17:28
Delphi-Version: 10 Seattle
Je nachdem was ich im Konstruktor eingegeben habe möchte ich dass eine Klasse ein bestimmtes Interface implementiert, oder eben nicht.


Da die Methode QueryInterface(..) von TInterfacedObject nicht virtuell ist muss ich eine neue Klasse erstellen.

Die Basisklasse sieht jetzt so aus:
Delphi-Quellcode:
   TInterfacedObject_VirtualQuery = class(TObject, IInterface)
   private var
      RefCount: Integer;
   public
      function QueryInterface(const IID: TGUID; out Obj): HRESULT; virtual; stdcall;
      function _AddRef(): Integer; stdcall;
      function _Release(): Integer; stdcall;
   end;
Delphi-Quellcode:
function TInterfacedObject_VirtualQuery.QueryInterface(const IID: TGUID; out Obj): HRESULT;
begin
   if GetInterface(IID, Obj) then
      Result := S_OK
   else
      Result := E_NOINTERFACE;
end;

function TInterfacedObject_VirtualQuery._AddRef(): Integer;
begin
   Result := TInterlocked.Increment(RefCount);
end;

function TInterfacedObject_VirtualQuery._Release(): Integer;
begin
   Result := TInterlocked.Decrement(RefCount);
   if (Result = 0) then
      Destroy();
end;

Wenn ich jetzt eine Klasse möchte die sich zur Laufzeit entscheidet ob sie ein Interface implementiert überschreibe ich QueryInterface(..) so:

Delphi-Quellcode:
   TMyObject = class(TInterfacedObject_VirtualQuery, ISomeInterface)
   public
      function QueryInterface(const IID: TGUID; out Obj): HRESULT; override; stdcall;
   end;
Delphi-Quellcode:
function TMyObject.QueryInterface(const IID: TGUID; out Obj): HRESULT;
begin
   Result := inherited QueryInterface(IID, Obj);
   if IID = TGUID(ISomeInterface) then
      begin
         if ichEntscheideMichEsNichtZuImplentieren then
            Result := E_NOINTERFACE;
      end;
end;

Habe ich etwas übersehen? Kann man das so machen?
  Mit Zitat antworten Zitat