![]() |
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:
Wie kann ich die Methode toString der Elemente der gemueseListe verwenden wenn ich nur den Typ IGemuese der Elemente kenne?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; bis denne Guido |
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 ? |
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. |
Re: Problem bei Zugriff auf Elemente eine TInterfaceList
Ob harte Casts mit Interfaces gehen :gruebel:
Mach lieber folgendes: Statt
Delphi-Quellcode:
lieber
IGemuese(gemueseListe[i]).toString
Delphi-Quellcode:
Du mußt "nur" deinem Interface eine GUID zuweisen:
if gemueseListe[i] is IGemuese then
(gemueseListe[i] as IGemuese).toString
Delphi-Quellcode:
IGemuese = interface(IInterface)
['{ABAD6C43-AE24-4719-9319-9E775365F45E}'] // <- Bitte neue eigene GUID mittels <Shift> + <Strg> + <g> erzeugen function toString : string; |
Re: Problem bei Zugriff auf Elemente eine TInterfaceList
Hallo Bernhard,
rein interessehalber. was passiert denn, wenn man die GUID ganzwegläßt ? Heiko |
Re: Problem bei Zugriff auf Elemente eine TInterfaceList
Zitat:
|
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 |
Re: Problem bei Zugriff auf Elemente eine TInterfaceList
Moin,
So funktioniert es auch mit Typ-Überprüfung:
Delphi-Quellcode:
Etwas kompliziert ist das mit den Interfaces in Delphi schon...
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; bis denne Guido |
Re: Problem bei Zugriff auf Elemente eine TInterfaceList
Zitat:
btw:
Delphi-Quellcode:
Geht aber auch nur über eine GUID, da GUIDs nunmal COM-Interfaces identifizieren.
if supports(objectInstance, IDeinInterface, interfaceInstance) then
interfaceInstance.DoSomething() else WTF('?'); |
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