2 Stimmen

Problem der Vererbung in Java

Ich habe 5 verschiedene Tabellen in einer Datenbank. Ich habe eine abstrakte "Converter.java"-Klasse geschrieben, die Daten aus der Datenbank entnimmt und in eine "tree.xml"-Datei konvertiert.

Baum.xml

<?xml version="1.0" standalone="no"?>
<tree>
   <declarations>
       <attributeDec1 name="name" type="String"/>
   </declarations>

   <branch>
       <attribute name="name" value="process 1"/>

       <leaf>
           <attribute name="name" value="process 2"/>
       </leaf>

       <leaf>
           <attribute name="name" value="process 3"/>
       </leaf>
   </branch>
</tree>

Wie Sie sich denken können, bleibt die Struktur der obigen tree.xml für alle 5 Tabellen gleich. Der einzige Unterschied liegt im Wert des Attributs "value".

Um den Wert des Attributs "value" zu erhalten, muss der Konverter zunächst die Datenbank nach diesen Werten abfragen.

Es sollte also 5 verschiedene Abfragen für 5 verschiedene Tabellen geben. Anstatt also 5 verschiedene Konverter zu programmieren, habe ich eine einzige "Converter.java" erstellt, die Funktionen hat wie

  • openTree()
  • closeTree()
  • openBranch()
  • closeBranch()
  • openLeaf()
  • closeLeaf()
  • addAttribute()

Von den oben genannten Methoden habe ich alle Methoden mit Ausnahme der addAttribute()-Methode implementiert, da die Implementierung von der Tabelle abhängig ist.

Danach habe ich 5 verschiedene Konverter programmiert, jeder für eine Tabelle und alle erweitern "Converter.java"

Ich habe ein Feld mit dem Namen "query" in der Klasse Converter.java angelegt. Da dieses Feld von allen 5 Konvertern geerbt wird, habe ich dieses Feld in den Konstruktoren dieser 5 Konverter initialisiert.

Meine Frage lautet nun wie folgt:

Q. Ich bin mir nicht sicher, ob ich die Vererbung richtig angewandt habe oder ob der obige Ansatz geändert werden sollte.

Edita:

Q2. Ich habe eine weitere Methode in der Klasse Converter.java, die das Feld "query" verwendet. Da das Feld nicht in der Klasse Converter.java initialisiert wird, ist es egal, ob ich diese Methode in alle 5 untergeordneten Konverter kopiere oder ob es in Ordnung ist, diese Methode in die übergeordnete Klasse (d.h. Converter.java) zu setzen.

3voto

axtavt Punkte 233070

Ich denke, das Muster Strategie wäre hier besser geeignet. Sie können eine nicht-abstrakte Converter Klasse mit dem gemeinsamen Verhalten, und versorgen Sie sie mit der ValueSource die einen tabellenspezifischen Wertabruf durchführen kann. Dann erstellen Sie eine QueryValueSource (eine Unterklasse von ValueSource ), um einen Wert auf der Grundlage der angegebenen Abfrage abzurufen.

Um eine konkrete Strategie zu erhalten, können Sie entweder verschiedene Abfragen an einen Konstruktor von QueryValueSource oder als Unterklasse, um tabellenspezifische Quellen zu erstellen.

1voto

spurserh Punkte 583

Ich hoffe, ich verstehe Ihre Frage richtig. Wenn ich das tue, dann klingt es so, als ob Sie das Feld direkt wie "mQuery = foo;" in jedem Konstruktor initialisieren? Wenn das der Fall ist, wäre es wahrscheinlich am besten, es nur im Konstruktor der Oberklasse zu initialisieren und dann den Konstruktor der Oberklasse in jedem Unterklassenkonstruktor wie "super(foo);" aufzurufen.

0voto

sateesh Punkte 26553

Zu Frage Q2: Sie können die Klasse Converter abstrakt machen und eine Implementierung für die Methode bereitstellen, die das Attribut "query" darin verwendet. Lassen Sie den Konstruktor der Konverter-Unterklassen das Attribut "query" initialisieren.

Was Q1 betrifft, so kann ich die Frage in dem von Ihnen angegebenen Kontext nicht ganz verstehen. Vielleicht würde ein Codebeispiel helfen. Aber mit diesem begrenzten Verständnis kann ich vorschlagen, ob Sie in Betracht gezogen haben, ob die Verwendung von Komposition anstelle von Vererbung hilfreich gewesen wäre? Außerdem scheint es mir, dass die Strategie Muster kann hier von Nutzen sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X