Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Je nach Kontext Objekt erstellen
Mashalla - Mo 01.11.10 21:24
Titel: Je nach Kontext Objekt erstellen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure TWindow.btOpenClick(Sender: TObject); const Playlist: Array[0..1] of TClass = (TM3U, TPLS); var Data: TStringList; I: Integer; Obj: TObject; begin if Window.OpenDlg.Execute then begin Data := TStringList.Create; try Data.LoadFromFile(Window.OpenDlg.FileName);
for I := Low(Playlist) to High(Playlist) do begin try Obj := Playlist[I].Create(Data); except Obj.Free; Obj := nil; end; if Assigned(Obj) then exit; end; finally Data.Free; end; end; end; |
Anbei folgende Prozedur, welche eine Datei lädt. Anschließend wird ein Objekt erstellt, dessen Konstruktor die StringList Data auf ein Dateiformat hin untersucht. Schlägt die Analyse fehl, wird eine Exception geworfen und die Schleife läuft ein weiteres Mal durch. Ich möchte je nach Dateiinhalt das passende Objekt erstellen, aber leider weiß ich nicht genau, wie ich das anstelle. Vielleicht ist mein Ansatz auch falsch.
Ich lade eine Datei und will entsprechend dem Inhalt das passende Objekt erstellen und die Daten weiterverarbeiten. Ich würde gerne massenhaft if-Abfragen vermeiden, da die Liste der Dateitypen länger als 3 oder 4 Elemente werden wird. Ich hoffe, mein Gedankengang wurde klar. Jemand eine Idee? :)
jaenicke - Mo 01.11.10 21:29
Da gibt es verschiedene Ansätze. Einmal das sogenannte Factory-Pattern, bei dem eine Klasse das korrekte Objekt erzeugt.
Ja, und ich mache das in der Regel so, dass ich die Klassen in einer Liste registrieren lasse und dann über die Liste die korrekte Klasse suche.
Durch eine Klassenmethode wird dann festgestellt ob die Klasse die passende ist.
Auf diese Weise muss die Liste nicht die Klassen alle kennen, sondern die Klasse registrieren sich einfach in der Liste.
delfiphan - Di 02.11.10 23:58
In Delphi wird häufig auf das Factory-Pattern verzichtet, da man relativ einfach mit den Typen direkt arbeiten kann, die hin- und herschieben kann und Instanzen ohne RTTI/Reflection instanzieren kann.
In deinem Fall musst du einfach darauf achten, dass du in deiner Basisklasse den Konstruktor virtual machst, damit du von einer Variablen von class of Basisklasse den Konstruktor der abgeleiteten Klasse kriegst (vgl. TComponent).
0xDEAD - Mi 03.11.10 11:46
jaenicke hat folgendes geschrieben : |
Ja, und ich mache das in der Regel so, dass ich die Klassen in einer Liste registrieren lasse und dann über die Liste die korrekte Klasse suche.
Durch eine Klassenmethode wird dann festgestellt ob die Klasse die passende ist.
Auf diese Weise muss die Liste nicht die Klassen alle kennen, sondern die Klasse registrieren sich einfach in der Liste. |
Hat da jemand mal ein konkretes Beispiel für?
jaenicke - Mi 03.11.10 11:59
Ich habe zu Hause eines, bei dem ich ca. 100 Dateitypen für einen allgemeinen Editor aus verschiedenen Units so registriere. Ich schaue nach der Arbeit mal, dass ich daraus ein Beispiel mache. ;-)
delfiphan - Mi 03.11.10 14:05
Nur als Randbemerkung; Mit
DphMEF [
http://www.delphi-forum.de/viewtopic.php?p=613133] kann man sowas auch. Ein Beispiel ist dabei. Das DphMEF habe ich aber eher so zum Spass entwickelt. Für Produktivcode würde ich jetzt auch einfach eine Klasse machen mit einer statischen Methode Register und einer statischen Liste (bei neueren Delphi-Versionen class var oder sonst in globalem Scope).
Als Beispiel könntest du dir TPicture.RegisterFileFormat und die Unit Jpeg anschauen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!