Einzelnen Beitrag anzeigen

hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#1

Interface und 'normale' Referenz

  Alt 6. Sep 2010, 14:29
Delphi-Version: 2010
Hallo zusammen,
folgendes Problem. Ich möchte ein Konzept über ein Interface definieren.
Delphi-Quellcode:
type
    IMachtBuh = interface
        procedure Buh;
    end;
Implementiert wird das z.B. von
Delphi-Quellcode:
type
    Foo = class(TInterfacedObject, IMachtBuh)
    public
        procedure Buh;
        procedure WasAnderes;
    end;

procedure Foo.Buh;
begin
    WriteLn('Foo Buh');
end;

procedure Foo.WasAnderes;
begin
    WriteLn('Was anderes');
end;
So, schön. Solche Objekt können jetzt Buh machen.
Delphi-Quellcode:
procedure MachBuh(b : IMachtBuh);
begin
    b.Buh;
end;
Das Problem ist jetzt, dass eine Foo Referenz im Aufruf von MachBuh implizit in ein IMachtBuh konvertiert wird, dass die Instanz am Ende von MachBuh auffrisst.
Delphi-Quellcode:
var
    f : Foo;
begin
    f := Foo.Create;
    MachBuh(f);
    /// ...
    f.WasAnderes; // haha, denkste! f is futsch.
    FreeAndNil(f);
end.
Natürlich kann ich f als IMachtBuh deklarieren, dann hab ich aber keinen Zugriff mehr auf die Konzepte die Foo selber defineirt oder über andere Interfaces erbt. Oder ich mach sowas:
Delphi-Quellcode:
var
    f : Foo;
    dummy : IMachtBuh;
begin
    f := Foo.Create;
    dummy := f;
    MachBuh(f);
    /// ...
    f.WasAnderes;
end.
Was aber auch nicht besonders elegant ist. Oder ich lass mir von Euch erklären wie man es am besten macht.
  Mit Zitat antworten Zitat