Ich Versuche gerade eine Routine zu schreiben, welche Instanzen von Klassen erzeugt, die ich nicht direkt kenne..
Zur besseren Veranschaulichung habe ich das angehängte Programm gebastelt.
In Auszügen :
Code: Alles auswählen
Type
{ TDummy }
TDummy = Class
private
fText: String;
public
Constructor create(); virtual;
Procedure DialOut();
Function Clone: TDummy;
End;
{ TDummy1 }
TDummy1 = Class(TDummy)
private
public
Constructor create(); override;
End;
{ TDummy2 }
TDummy2 = Class(TDummy)
private
public
Constructor create(); override;
End;
{ TDummy3 }
TDummy3 = Class(TDummy1)
private
public
Constructor create(); override;
End;
{ TForm1 }
TForm1 = Class(TForm)
public
{ public declarations }
Talker: TDummy;
RegisteredClasses: Array Of TClass;
RegisteredClasses2: Array Of TDummy;
Procedure RegisterClass(Class_: TClass; Name_: String);
Procedure RegisterClass2(Class_: TDummy; Name_: String);
End;
Procedure TForm1.FormCreate(Sender: TObject);
Begin
ComboBox1.Clear;
Talker := Nil;
RegisterClass(TDummy1, 'Dummy1');
RegisterClass(TDummy2, 'Dummy2');
RegisterClass(TDummy3, 'Dummy3');
RegisterClass2(TDummy1.create, 'Dummy1');
RegisterClass2(TDummy2.create, 'Dummy2');
RegisterClass2(TDummy3.create, 'Dummy3');
End;
Procedure TForm1.Button1Click(Sender: TObject);
Begin
If ComboBox1.ItemIndex <> -1 Then Begin
If assigned(Talker) Then Talker.free;
(*
* Dieses Case will ich mittels des RegisteredClasses Array's realisieren, geht das ?
*)
Case ComboBox1.ItemIndex Of
0: talker := TDummy1.create();
1: talker := TDummy2.create();
2: talker := TDummy3.create();
End;
(*
talker := RegisteredClasses[0].Create As TDummy; // Das hier geht leider nicht
*)
talker.DialOut();
End;
End;
Procedure TForm1.Button2Click(Sender: TObject);
Begin
If ComboBox1.ItemIndex <> -1 Then Begin
If assigned(Talker) Then Talker.free;
(*
* Das Clone geht leider auch nicht, da es ja immer eine Instanz von TDummy erzeugt und nicht von TdummyX
*)
Talker := RegisteredClasses2[ComboBox1.ItemIndex].Clone;
talker.DialOut();
End;
End;
Die einzige alternative die mir einfällt ist die variante mit der clone routine. Hierzu muss ich aber in jeder Kind Klasse die Clone Routine "Händisch" überschreiben/ neu machen. Wenns irgendwie geht würde ich auf diese Lösung gerne verzichten können.
Kann mir evtl. Jemand von euch helfen ?