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?