AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse die benötigte Klasse erstellt

Ein Thema von Sascha L · begonnen am 31. Aug 2006 · letzter Beitrag vom 4. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#1

Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 11:27
Hallo,

der Titel passt nicht unbedingt, aber ich wusste nicht, wie ich es anders in Kurzform ausdrücken sollte.

Ich habe eine Hauptklasse "TParser":

Delphi-Quellcode:
TParser = class(TPersistent)
    private
      fFeedItem : TFeedItem;
      fFeed: TFeed;
      fFeedType: TFeedType;
      fXMLDoc: IXMLDocument;
      procedure GetFeedType;
    public
      constructor Create(XMLDoc: TStream); virtual;
      property FeedType: TFeedType read fFeedType write fFeedType;
  end;
Das ist nur ein kleiner Teil und die Klasse ist mehr oder weniger noch ohne Funktion.

Von dieser leite ich dann ab und habe z.B. dann die Klassen TRSSParser, TAtomParser, TRDFParser, usw.

In den Unterklassen werden dann später die entsprechenden abstrakten Prozeduren überschrieben und mit Inhalt gefüllt, sodass ich die entsprechenden XML-Dateien auslesen kann.

Nun zum eigentlichen Problem: Wenn die ganzen Klassen später fertig sind, soll es so einfach wie nur möglich sein, einen Feed zu parsen. Wenn ich das nun so alles lasse, müsste man im Hauptprogramm z.B. beim Öffnen einer XML-Datei immer erst überprüfen, um was für einen Feed-Typ es sich handelt und demendsprechend dann TRSSParser.Create, TAtomParser.Create, etc. machen.

Am besten wäre es ja, wenn man einfach nur TIrgendwas.Create machen würde und dann die entsprechende Klasse erstellt wird.

Gibt es dafür irgendeine "coole" Lösung? Die einzige, nicht so schöne, die mir einfällt wäre eine Funktion, der ich die XML-Datei übermittel, die dann halt überprüft, um was es sich handelt und dann die entsprechende Klasse erstellt und zurückliefert.

Gruß
Sascha
Sascha
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 11:34
Ungefähr so wird es auch gemacht. Du kannst dir eine "professionelle" Lösung dafür im .NET-Framework anschauen, genauso wird es nämlich bei der WebRequest-Klasse gemacht. Diese hat eine statische Methode Create (kein Konstruktor), die als Parameter die zu öffnende URI übernimmt und dann die entsprechende Ableitung instanziiert, also z.B. HttpWebRequest oder FtpWebRequest. Ist zwar, wie ich finde, nicht die allersauberste Lösung (weil die Basisklasse über ihre Ableitungen Bescheid wissen muss), aber es ist recht praktisch.
In deinem Fall ist es ja vermutlich so, dass deine Klasse den XML-Code so oder so runterladen muss, das kann die Basisklasse ja schon machen, und dann anhand der ersten Zeilen, also DTD, Schema oder Root-Element, wie auch immer, ermitteln kann, an welchen Parser das ganze übergeben werden muss.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 11:39
Mach es wie bei TPicture: Polymorphie.

Du bastelst dir einen Wrapper, der einen TParser enthält und per property nach außen anbietet. Der überprüft dann, was für eine Art von Datei es ist und erzeugt dann den entsprechenden Parser.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 11:43
Siehe auch Factory-Pattern.

[add]
Zitat von 3_of_8:
Mach es wie bei TPicture: Polymorphie.
Benutzt er doch schon längst . Und eine Factory-Klasse benötigt meistens keine Polymorphie.
[/add]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#5

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 11:50
TPicture geht doch den umgekehrten Weg, oder? Man lädt beliebige Daten rein, und bekommt dann anhand einer Eigenschaft genau das Format, das man will (falls es verfügbar ist). Hier geht es aber doch darum, beliebige Daten reinzuladen, und dann in einem standardisierten Format die Daten zu bekommen. Da würde ich eher keinen extra Wrapper für bauen, das ist ja nur eine Indirektion, die dem Benutzer hier nicht viel bringt (finde ich).

Edit roter Kasten:
Das ist zwar das Factory-Pattern, aber ich halte es in diesem Fall für, naja, zu viel, eine extra Klasse dafür zu haben. Ist dann eben ein kleiner Unterschied in der Ausrichtung, im einen Fall ist die statische Create-Methode ein Implementierungsdetail (für den Fall, dass der Benutzer eh nie mit den abgeleiteten Klassen selbst arbeiten soll), im anderen Fall ist die Factory das Implementierungsdetail von außen, das man unabhängig von der Basisklasse ändern kann, aber das auch eine zusätzlich Indirektion bedeutet, die hier eventuell nicht benötigt wird.
Edit roter Kasten 2:
Factory-Klasse hat doch Polymorphie, weil sie eine Ableitung einer Basisklasse zurückliefert (oder Implementierung einer Schnittstelle), oder?

Merkt man eigentlich, dass ich selbst hier mehr lerne als ich anderen erzähle? ^^
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 12:05
Ich hatte mal ein ähnliches Problem, bei dem ich auch dynamisch festlegen musste, welche Klasse denn nun letztendlich instantiert werden muss.... Hier ist die Lösung, mit der ich dann das Ganze umgesetzt habe: mit Metaklassen.
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 12:22
Danke für eure Hilfen!!

Ich habe nun folgende Lösung, mit der ich zufrieden bin und die gleichzeitig sogar mehr Funktionalität hat:

Delphi-Quellcode:
  TFeedParser = class(TPersistent)
    private
      fFeeds: TList;
      function GetFeed(Index: Integer): TParser;
    public
      constructor Create;
      destructor Destroy;
      procedure AddFeed(XMLDoc: TStream);
      property Feeds[Index: Integer]: TParser read GetFeed;
  end;
Bei "AddFeed" wird dann überprüft um was für einen Feed es sich handelt und dann demendsprechend z.B. TRSSParser hinzugefügt.

Das klappt einwandfrei und das tolle ist, dass ich nun sogar mehrere und vor allem unterschiedliche Feeds hinzufügen kann, ohne z.B. einen Array zu erstellen
Sascha
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 12:25
Zitat von OregonGhost:
Das ist zwar das Factory-Pattern, aber ich halte es in diesem Fall für, naja, zu viel, eine extra Klasse dafür zu haben.
Für die funktion des Patterns ist es ziemlich irrelevant, ob es nun als statische Methode in der Basisklasse oder in einer eigenen Klasse implementiert ist. Ich würde wahrscheinlich Letzteres wählen, da ich die Benutzung der abgeleiteten Klassen in ihrer Basisklasse etwas unschön fände.
Zitat:
Factory-Klasse hat doch Polymorphie, weil sie eine Ableitung einer Basisklasse zurückliefert (oder Implementierung einer Schnittstelle), oder?
Wie gesagt, den Teil hat er doch schon . Aber die Factory-Klasse selbst ist bei einfachen Implementationen meist statisch (nicht ganz so simples Gegenbeispiel wäre System.Data.Common.DbProviderFactory/Factories).

@Jelly: Kommt ganz darauf an, wie generisch die Factory werden soll. Wenn es bei den vier, fünf Klassen bleibt, kann man die auch noch hart in die Factory coden.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 12:26
Zitat von Sascha L:
Das klappt einwandfrei und das tolle ist, dass ich nun sogar mehrere und vor allem unterschiedliche Feeds hinzufügen kann, ohne z.B. einen Array zu erstellen
Das mag auf den ersten Blick einfach erscheinen, aber Du hast jetzt immer 2 Stellen an denen Du pflegen musst, wenn mal ein neuer XMLParser hinzukommt. Dann musst Du nämlich nicht nur die neue Klasse implementieren, sondern auch die AddFeed Methode aus deiner TFeedParser Klasse.

Hast Du meinen Link gelesen?
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#10

Re: Klasse die benötigte Klasse erstellt

  Alt 31. Aug 2006, 12:31
Zitat:
Für die funktion des Patterns ist es ziemlich irrelevant, ob es nun als statische Methode in der Basisklasse oder in einer eigenen Klasse implementiert ist. Ich würde wahrscheinlich Letzteres wählen, da ich die Benutzung der abgeleiteten Klassen in ihrer Basisklasse etwas unschön fände.
D.h., die Implementierung wie im WebRequest ist genau genommen auch das Factory-Pattern?
Wie ich schon sagte, im Normalfall fände ich die Benutzung der abgeleiteten Klasse auch unschön, aber in diesem Fall handelt es sich in meinen Augen um reine Implementierungsdetails, die dem Benutzer egal sein können. Wobei Sascha L ja ohnehin eine interessante Variante gefunden hat.

Zitat von Jelly:
Das mag auf den ersten Blick einfach erscheinen, aber Du hast jetzt immer 2 Stellen an denen Du pflegen musst, wenn mal ein neuer XMLParser hinzukommt. Dann musst Du nämlich nicht nur die neue Klasse implementieren, sondern auch die AddFeed Methode aus deiner TFeedParser Klasse.
Hmm, muss man beim Metaklassen-Prinzip nicht die ID der Klasse kennen? Sprich, man müsste auch zwei Stellen pflegen? Das mit den Metaklassen ist doch vom Prinzip her ähnlich wie COM-Instanziierung, oder sehe ich das falsch?
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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