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.