Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interface-Übergabe (https://www.delphipraxis.net/74414-interface-uebergabe.html)

DGL-luke 2. Aug 2006 22:45


Interface-Übergabe
 
Hallo,

folgende Situation:

Delphi-Quellcode:
type
  IMyInterface = interface(IInterface)
    [(GUID-Zeuch)]
    funktionen(zeuch);
  end;

  TMyInterfaced = class(TInterfacedObject,IMyInterface)
    funktionen(zeuch);
  end;
Darauf will ich jetzt zugreifen:

Delphi-Quellcode:
ObjektListe.Add(TMyInterfaced.Create);

SomeControl.Data := Liste[0]; // Data is Pointer
Und jetzt gibt es irgendwo ein Ereignis:

Delphi-Quellcode:
procedure Bla(Sender: TObject);
begin
  MethodeDieIMyInterfaceWill(IMyInterface(SomeControl.Data));
end;
So, und da knallts, aber gewaltig... was bisher der Compiler nicht wollte:

Delphi-Quellcode:
var obj: TObject;

obj := TObject(SomeControl.Data);
MethodeDieIMyInterfaceWill(obj as IMyInterface);
Und so einiges anderes an wildem rumgecaste... er scheint TObject nicht als mit IInterface kompatibel anzuerkennen. wie sag ic h ihm, er solls trotzdem machen, ohne ihm irgendeine Vertreterklasse (in der ich das Interface implementiere) hinzucasten, was ja eigentlich nicht der Sinn von interfaces ist?

Dax 2. Aug 2006 22:54

Re: Interface-Übergabe
 
Wenn du statt TList TInterfaceList nimmst und statt Referenzen auf die Klassen direkt das Interface ablegst, gehts ;)

DGL-luke 2. Aug 2006 23:10

Re: Interface-Übergabe
 
ah ja. gut zu wissen.

DGL-luke 2. Aug 2006 23:21

Re: Interface-Übergabe
 
ähm... immer noch av... ich machs jetzt so:

Delphi-Quellcode:
InterfaceListe.Add(TMyInterfaced.Create);
SomeControl.Data := Pointer(InterfaceListe[0]);
Delphi-Quellcode:
Pointer(intf) := SomeControl.Data;
MethodeDieIMyInterfaceWill(intf); <- knallt hier
EDIT: 3_of_8 hat mich drauf hingewiesen.... TMyInterfaced ist natürlich von TInterfacedObject abgeleitet.

DGL-luke 3. Aug 2006 21:37

Re: Interface-Übergabe
 
Soo... hab das ganze jetzt komplett gekippt und verwende eine Managerklasse, die Klassen und Elemente hält und bei Bedarf ein Interface rausgibt... da geht der Refcount zwar ganz schnell auf 25, aber das krieg ich schon noch hin.

Für mich ist die Sache erledigt, und nein, den anderen Code zeige ich nicht, das ist Produktionscode, den ich nicht offenlegen darf (bisheriger Code war "anonymisiert" ;) )

PS: Bitte keine blöden Kommentare dazu, wie bereits gesagt, der neue Code hat mit dem alten nichts gemein.
(ich sag das nur, weils den fall schon mal gab...)

Bernhard Geyer 3. Aug 2006 21:50

Re: Interface-Übergabe
 
Hallo Lukas,

deine Versuch mittels Casten eines Interfacezeigers auf einen untypisierten Pointer ist eine ganz böse sache da du hiermit dem Compiler keine Chance läßt die Referenzzählung durchzuführen. Wenn Du den Destruktor deiner TMyInterfaced-Klasse mal debuggen würdest, würdest Du vermutlich feststellen das die Klasse schon zu einem Zeitpunkt freigegeben wird, zu dem du es nicht erwartest.

Ich würde ebenfalls noch eine Co-Klassen definieren damit du ähnich wie bei COM-Interfaces nur noch mit Interfaces arbeitest und nicht in die Versuchung kommst einen gemischten Betrieb zu fahren.

DGL-luke 3. Aug 2006 21:57

Re: Interface-Übergabe
 
CoKlasse? Hab ich schonmal gehört... wie macht man das?

Bernhard Geyer 3. Aug 2006 22:01

Re: Interface-Übergabe
 
Delphi-Quellcode:
type
  CoMyInterfaced = class
    class function Create: IMyInterfaced;
  end;

class function CoMyInterfaced.Create: IMyInterfaced;
begin
  result := TMyInterfaced.Create;
end;

DGL-luke 3. Aug 2006 22:06

Re: Interface-Übergabe
 
ah... na das ist natürlich elegant.

negaH 3. Aug 2006 22:09

Re: Interface-Übergabe
 
Dann geht aber auch

Delphi-Quellcode:
  TMyInterface.Create as IMyInterface
und das ohne extra Klasse und Typsicher.

Gruß Hagen

Bernhard Geyer 3. Aug 2006 22:22

Re: Interface-Übergabe
 
Aber mit der Co-Klasse kann man die eigentliche Implementierungsklasse so gut "verstecken" (in Implementierungsabschnitt von Unit) das keiner sie direkt verwenden kann sondern nur über das Interface.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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