Einzelnen Beitrag anzeigen

Dax
(Gast)

n/a Beiträge
 
#3

Re: Implementierung eines Interfaces

  Alt 18. Jun 2006, 15:02
QueryInterface benutzt der Compiler bei as-Casts zu Interfaces um zu kucken, ob der zu castende Typ überhaupt dieses Interface implementiert. _AddRef und _Release sind zur Referenzzählung da, wenn die Referenzen auf das Interface auf 0 fallen, gibt es sich automatisch frei: GC für faule -> ausschalten wenn möglich.

Ganz einfach gehts so:
Delphi-Quellcode:
type
  TMyInterfacedClass = class(TInterfacedObject, IMyInterface)
    ...
  end;
Wenn ich in Delphi mit Interfaces arbeite, benutze ich immer das als Basisklasse:
Delphi-Quellcode:
type
  IHAMInterface = interface
    ['{F7509748-217A-42EB-B6FB-A45C25310F8A}']
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;

    procedure AllowDestruction;
  end;

  THAMObject = class(TObject, IHAMInterface)
  private
    fDestroying: Boolean;
  protected
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; virtual; stdcall;
    function _Release: Integer; virtual; stdcall;

    procedure AllowDestruction;
  public
    constructor Create; virtual;

    property Destroying: Boolean read fDestroying write fDestroying;
  end;

procedure THAMObject.AllowDestruction;
begin
  fDestroying := True;
end;

constructor THAMObject.Create;
begin
  inherited;
end;

function THAMObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function THAMObject._AddRef: Integer;
begin
  Result := 1;
end;

function THAMObject._Release: Integer;
begin
  Result := 1;
  if fDestroying then
    Free;
end;

@mkinzler: Eigentlich sinds doch Methoden von TInterfacedObject?
  Mit Zitat antworten Zitat