![]() |
Delphi-Version: 2010
Interface und 'normale' Referenz
Hallo zusammen,
folgendes Problem. Ich möchte ein Konzept über ein Interface definieren.
Delphi-Quellcode:
Implementiert wird das z.B. von
type
IMachtBuh = interface procedure Buh; end;
Delphi-Quellcode:
So, schön. Solche Objekt können jetzt Buh machen.
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;
Delphi-Quellcode:
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.
procedure MachBuh(b : IMachtBuh);
begin b.Buh; end;
Delphi-Quellcode:
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:
var
f : Foo; begin f := Foo.Create; MachBuh(f); /// ... f.WasAnderes; // haha, denkste! f is futsch. FreeAndNil(f); end.
Delphi-Quellcode:
Was aber auch nicht besonders elegant ist. Oder ich lass mir von Euch erklären wie man es am besten macht.:wink:
var
f : Foo; dummy : IMachtBuh; begin f := Foo.Create; dummy := f; MachBuh(f); /// ... f.WasAnderes; end. |
AW: Interface und 'normale' Referenz
Kombinierte Verwendung von Interface + Objektreferenz macht Probleme mit automatisher Referenzzählung.
Wenn du mit Interfaces arbeitest dann nur noch mit diesen! |
AW: Interface und 'normale' Referenz
Wenn du weißt, was du tust, kannst du statt von TInterfacedObject auch von TInterfacedPersistent (classes.pas) ableiten. Dann musst du aber selbst auch für die Freigabe sorgen.
|
AW: Interface und 'normale' Referenz
Zitat:
Zitat:
|
AW: Interface und 'normale' Referenz
Zitat:
Delphi-Quellcode:
Hier nehm ich mir of COM als vorbild und leg mit eine Co-Funktion an und die Implementierende Klasse soweit verstecken das keiner mehr darauf kommt diese entsprechend über Refernzzeiger zu verwenden:
var
f : IMachtBuh; begin f := Foo.Create;
Delphi-Quellcode:
funktion CoFoo: IMachtBuh;
begin result = Foo.Create; end; |
AW: Interface und 'normale' Referenz
Zitat:
|
AW: Interface und 'normale' Referenz
Seit Delphi 2010 kann man endlich von Interface auf Instanz casten.
Code:
var
f : IMachtBuh; begin f := Foo.Create; (f as Foo).WasAnderes; |
AW: Interface und 'normale' Referenz
Hallo,
wenn es nur darum geht, eine Funktion aufzurufen, kannst Du auch mit
Delphi-Quellcode:
arbeiten:
const
Delphi-Quellcode:
Dadurch wird der Referenzzähler beim Aufruf nicht verändert und folglich das Objekt am Ende nicht freigegeben. Man sollte übrigens immer
procedure MachBuh(const b : IMachtBuh);
begin b.Buh; end;
Delphi-Quellcode:
verwenden, das vermeidet Fehler und ist außerdem noch schneller.
const
Gruß xaromz |
AW: Interface und 'normale' Referenz
Zitat:
|
AW: Interface und 'normale' Referenz
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz