Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei Zugriff auf Elemente eine TInterfaceList (https://www.delphipraxis.net/77579-problem-bei-zugriff-auf-elemente-eine-tinterfacelist.html)

Astan212 21. Sep 2006 13:11


Problem bei Zugriff auf Elemente eine TInterfaceList
 
Moin,

für Schulungszwecke habe ich Java-Code auf Delphi umzuschreiben und bin ich auf folgendes Problem gestoßen:

Der Delphi-Code sieht so aus:
Delphi-Quellcode:

 IGemuese = interface(IInterface)
    function toString : string;
 end;

...

 TKnoblauch = class(TInterfacedObject,IGemuese)
  public
    function toString : string;
  end;

  TPaprika = class(TInterfacedObject, IGemuese)
  public
    function toString : string;
  end;

  TPilze = class(TInterfacedObject, IGemuese)
  public
    function toString : string;
  end;
...

 function TKnoblauch.toString : String;
 begin
   Result := 'Knoblauch';
 end;
 //usw. für die anderen Gemüse

...

function TMyBelag.erstelleGemuese: TInterfaceList;
var i: Integer;
    gemueseListe: TInterfaceList;
begin
  gemueseListe := TInterfaceList.Create;
  gemueseListe.Add(TKnoblauch.Create);
  gemueseListe.Add(TPilze.Create);
  gemueseListe.Add(TPaprika.Create);

 
  for i:=0 to gemueseListe.Count-1 do
  begin
    WriteLn(IGemuese(gemueseListe[i]).toString); //und das geht dann hier nicht (Zugriffsverletzung)!
  end;

  result := gemueseListe;
end;
Wie kann ich die Methode toString der Elemente der gemueseListe verwenden wenn ich nur den Typ IGemuese der Elemente kenne?

bis denne
Guido

TKC 21. Sep 2006 13:33

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Hi,

bist du gezwungen das per Interfaces zu machen oder ist das nur ein Ansatz von dir ?

Astan212 21. Sep 2006 13:40

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Es geht dabei um ein Beispiel der Umsetzung einer einfachen verteilten Anwendung in C#, Java und Delphi in mehreren Schritten.

Dem Client sind am Ende nur die Interfaces mit u.a. IGemuese bekannt.

Bernhard Geyer 21. Sep 2006 13:59

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Ob harte Casts mit Interfaces gehen :gruebel:

Mach lieber folgendes:

Statt
Delphi-Quellcode:
IGemuese(gemueseListe[i]).toString
lieber
Delphi-Quellcode:
if gemueseListe[i] is IGemuese then
  (gemueseListe[i] as IGemuese).toString
Du mußt "nur" deinem Interface eine GUID zuweisen:

Delphi-Quellcode:
IGemuese = interface(IInterface)
    ['{ABAD6C43-AE24-4719-9319-9E775365F45E}']  // <- Bitte neue eigene GUID mittels <Shift> + <Strg> + <g> erzeugen
    function toString : string;

hoika 21. Sep 2006 14:05

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Hallo Bernhard,

rein interessehalber.
was passiert denn, wenn man die GUID ganzwegläßt ?


Heiko

Bernhard Geyer 21. Sep 2006 14:07

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Zitat:

Zitat von hoika
Hallo Bernhard,

rein interessehalber.
was passiert denn, wenn man die GUID ganzwegläßt ?


Heiko

Dann funktioniert is/as nicht.

Astan212 21. Sep 2006 14:19

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Moin,

is funktioniert auch mit GUID nicht (Fehler: Operator ist auf diesen Operandentyp nicht anwendbar).
Das (gemueseListe[i] as IGemuese).toString funktioniert aber und reicht mir eigentlich schon als Lösung.
Vielen Dank, Bernhard!

bis denne
Guido

Astan212 21. Sep 2006 15:12

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Moin,

So funktioniert es auch mit Typ-Überprüfung:

Delphi-Quellcode:
function TMyBelag.erstelleGemuese: TInterfaceList;
var i: Integer;
    MyObject: TInterfacedObject;
begin
  gemueseListe := TInterfaceList.Create;
  gemueseListe.Add(TKnoblauch.Create);
  gemueseListe.Add(TPilze.Create);
  gemueseListe.Add(TPaprika.Create);

  for i:=0 to gemueseListe.Count-1 do
  begin

    if gemueseListe[i].QueryInterface(IGemuese,MyObject) = S_OK then  
      WriteLn((gemueseListe[i] as IGemuese).toString);
  end;
  result := gemueseListe;
end;
Etwas kompliziert ist das mit den Interfaces in Delphi schon...

bis denne
Guido

Elvis 21. Sep 2006 15:32

Re: Problem bei Zugriff auf Elemente eine TInterfaceList
 
Zitat:

Zitat von Astan212
Etwas kompliziert ist das mit den Interfaces in Delphi schon...

Ohne COM würde ich dir Recht geben, aber COM-compliant interfaces mit autom. Referenzzählung sind schon sehr praktisch beim Konsumieren oder Bereitstellen von COM-Schnittstellen. ;)

btw:
Delphi-Quellcode:
if supports(objectInstance, IDeinInterface, interfaceInstance) then
  interfaceInstance.DoSomething()
else
  WTF('?');
Geht aber auch nur über eine GUID, da GUIDs nunmal COM-Interfaces identifizieren.


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