Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Instanziierung von Interfaces (https://www.delphipraxis.net/194467-instanziierung-von-interfaces.html)

Levitan 25. Nov 2017 08:06

Instanziierung von Interfaces
 
Hallo zusammen,

Ich würde gerne Ein Interface dynamisch instanziieren. Damit meine ich: Der zu instanzierende Klassentyp kommt als String aus einer eigenen Customizing Tabelle.

Folgende Variante ist mir geläufig:
Ein Case Block mit "1 : mo_Irgend_ein_Interface := TCL_Irgendeine_Implementierende_Klasse.Create" ist eine statische Geschichte die für
mich nicht zielführend ist, (wenn es sich irgendwie vermeiden lässt).
Warum?: Weil jedesmal wenn ich eine weitere implementierende Klasse anlege, muss ich den CASE Block erweitern.

Gibt es in Delphi (Version?) eine Möglichkeit diese Instanziierung über einen String zu bewerkstelligen?
Dies wäre eine viel bessere Möglichkeit. z.B:

VAR
lo_IFC : TIF_Irgend_Ein_Interface
lv_Klassen_Name : String;

lv_Klassen_Name := 'TCL_Implementierende_Klasse_A';
lo_IFC := ( lv_Klassen_Name ).Create // <- Hier ist kein Case Block notwendig. NUR, leider funktioniert dies nicht in Delphi.

Ich habe es auch schon mit TYPE OF versucht, aber keine Chance.

Was mache ich Falsch, bzw. geht es überhaupt und wenn ja, wie ?


Gruß
Levitan

DeddyH 25. Nov 2017 09:44

AW: Instanziierung von Interfaces
 
Such doch hier im Forum mal nach "Class Factory", da solltest Du ein paar Ansätze finden.

dummzeuch 25. Nov 2017 09:44

AW: Instanziierung von Interfaces
 
Zitat:

Zitat von Levitan (Beitrag 1387140)
Ich würde gerne Ein Interface dynamisch instanziieren. Damit meine ich: Der zu instanzierende Klassentyp kommt als String aus einer eigenen Customizing Tabelle.

Eine Möglichkeit wäre, dass sich alle Klassen, die ein Interface implementieren, irgendwo regstrieren, so dass eine Factory-Methode sie anhand des Namens instantiieren kann. In der Regel geschieht diese Registrierung durch einen Aufruf wie

Delphi-Quellcode:

ClassFactoryXY.RegisterClass('NameOfClass', TNameOfClass);
In meinem Code erfolgt die Registrierung meist in der Initialization Section der Unit, in der die Klasse deklariert wird.

Um diese Registrierungen zu speichern könnte man z.B. ein Dictionary anlegen, mit dem Namen der Klasse als Key und einem Class Pointer als Value. Ich benutze noch ein älteres Delphi, das TDictionary noch nicht kennt, und habe deshalb TStringList verwendet.

Die Instantiierung erfolgt dann duch einen Aufruf der ClassFactory wie diesen:

Delphi-Quellcode:

MyIntVariable := ClassFactoryXY.CreateInstance('NameOfClass');

DeddyH 25. Nov 2017 09:52

AW: Instanziierung von Interfaces
 
Genau, ich habe auch mein Beispiel wiedergefunden: http://www.delphipraxis.net/1360719-post13.html. Das funktioniert in der Form aber erst ab Delphi 2010 (wegen Generics und der erweiterten RTTI), davor muss man ein paar andere Klimmzüge machen.

Levitan 25. Nov 2017 09:58

AW: Instanziierung von Interfaces
 
Hallo zusammen,

ganz herzlichen Dank für eure Antworten.
Ich denke das hilft mir weiter. :)


Gruß
Levitan

Mavarik 26. Nov 2017 13:25

AW: Instanziierung von Interfaces
 
Hi!

Ich würde an ein Dictionary die GUID des Interface registrieren... Und die Classe oder die Create-Methode

Das kann auch eine TFunc sein, die das Interface zurück gibt.

Mavarik


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz