Problem mit Vererbung - Kein wirklicher Nutzen.

Status
Nicht offen für weitere Antworten.

KSG9|sebastian

Top Contributor
Morgen,

ich steh grad n bissl aufm Schlauch. Folgender Code

Code:
class Question{
  protected String text;

  //getter und setter
}

class TextQuestion extends Question{
   private String answer;

   //getter und setter
}

class OptionQuestion extends Question{
   private String[] options;
  
   //getter und setter 
}

XML-Datei

Code:
<..>
   <question type="select"...>
      <text>blah</text>
      <options>
          <text>a</text>
          <text>b</text>
      </options>
    </question>  

   <question type="text"...>
      <text>blah</text>
      <textfield/>
    </question>  

</..>

In einer Liste sind 0..n Objekte vom Typ Text- oder Optionquestion gespeichert.
Problem ist, dass ich bei jedem Zugriff auf eines dieser Objekte den genauen Typ kennen muss.

Mapping XML-Java:

Anhand des Attributewertes "type" vom question-Element wird der Typ entschiedenl.

Beispiel: Erzeugen der Objekte aus einer XML-Struktur

Code:
Question q = null;
if(type.equals("select")){
q = new OptionQuestion();
((OptionQuestion)q).setOptions(...)
} else{
q = new TextQuestion();
}

Und so hab ich es in fast jeder Funktion.
Z.B. bei:

- jeder JSP-Datei (da hier unterschiedliche HTML-Elemente dargestellt werden,abhängig von Attributen in der Klasse)
- jedem Ändern, Editieren, Erstellen einer Frage

u.s.w.

Beim erstellen kann ich mir Factory-Methoden erstellen, aber das löst die anderen Probleme noch lange nicht.
Wie könnt ich das machen?
In der Question-Klasse ne Methode erstellen welchen mir den HTML-Code zurückgibt könnt ich machen, ist aber absolut pfusch, deshalb lass ich es gleich :)

Gruß Sebastian
 

byte

Top Contributor
Beim erstellen kann ich mir Factory-Methoden erstellen, aber das löst die anderen Probleme noch lange nicht.
Wie könnt ich das machen?

Welche anderen Probleme denn? Ich weiss nicht so genau, was das Problem nun ist. :)

Wegen dem Erzeugen: Mach doch einfach eine Factory Methode, der Du den String des type-Attributs übergibst. Der macht dann die Fallunterscheidung und liefert Dir das jeweils richtige neue Question Objekt zurück.
 

SnooP

Top Contributor
Es klingt immer falsch - aus Sicht der OOP - wenn man von einer anderen Klasse oder sogar von mehreren ne Fallunterscheidung machen muss, welcher Typ übergeben wurde... die Funktionalität die in der Fallunterscheidung liegt, sollte in der unterschiedlichen Implementierung einer Methode des übergebenen Objekts liegen - dann ist auch in der Vererbung wieder nen Sinn... - ich hab das genaue Problem nicht in Gänze verstanden - war mir zuviel input ;) - aber das nur so als allgemeiner Hinweis ob nicht evtl. schon was am Design hängen könnte.
 

KSG9|sebastian

Top Contributor
@SnooP: Genau das meine ich.

Zu den weiteren Problemen kurz ne Info zur Anwendung:

Die Anwendung ist für firmeninterne Umfragen gedacht. Eine Umfrage besteht aus x Seite, jede Seite aus x Fragen vom Typ TextQuestion oder OptionQuestion.

Bei folgenden Funktionen habe ich immer diese Fallunterscheidung:

- Anzeigen der Fragen auf einer JSP-Seite, weil eine TextQuestion anders angezeigt wird als eine OptionQuestion. Desweiteren hat eine TextQuestion als Antwortmöglichkeit Freitext, eine OptionQuestion eben vorgegebene Antworten

Und solche Unterscheidungen hab ich durch das ganze Programm, jedesmal if(a instanceof b) u.s.w.

Aber irgendwie komm ich auf keine sinnvolle Lösung.
Die Probleme beim erstellen wegzukriegen ist nicht schwer, aber dafür die 25 anderen Fallunterscheidungen, welche sicher nicht Sinn einer Vererbung sind.

Steht grad irgendwie aufm Schlauch :)
 

SnooP

Top Contributor
mach ne display() Methode in der TextQuestion und OptionQuestion... die erzeugt nach aufruf nen entsprechenden string mit dem html... - zwar ist dann nen visueller Teil in dem Ding drin, kann man aber in dem Fall vertreten... - evtl. kann man das auch noch weiter kapseln - müsste man mal drüber nachdenken, z.B. in Factory-Klassen wie oben schon angedeutet die aber dann von TextQuestion und OptionQuestion selbst angetippt werden...

ist auf jeden Fall besser als von außen Fallunterscheidungen zu machen ;)
 

KSG9|sebastian

Top Contributor
ja...das mit der display()-Methode hab ich mir schon überlegt, bringt aber nur bedingt was. Somit bleiben statt ca. 25 Fallunterscheidungen noch ca. 10 Stück. Und die kann ich so nich lösen da sie nicht zum anzeigen da sind sondern z.B. zum speichern von Änderungen an einer Seite, zum Speichern der Antworten von nem Benutzer, u.s.w.
 

SnooP

Top Contributor
hmm... du hast von außen ne bestimmte Funktionalität zu erfüllen... z.B. das unterschiedliche Anzeigen einer Information oder das unterschiedliche Speichern je nach Typ.
Warum ist dann die Funktionalität die unterschiedlich ist nicht im Objekt selbst drin (also in TextQuestion oder OptionQuestion). Von außen wird dann jeweils nur auf die Methode der Oberklasse zugegriffen und je nach Typ wird dann die tatsächliche Aktion ausgeführt... genau so macht Vererbung Sinn... - wenns andersrum läuft, dann ganz kräftig umbauen ;) ... dadurch zerschießt man sich nämlich auch gleichzeitig alle Möglichkeiten der einfachen Erweiterbarkeit... stelle man sich vor es kommt noch ne ToggleQuestion oder was auch immer hinzu, müsste man von außen an jeder Stelle wo bzgl. des Typs ne andere Funktionalität benötigt wird eine Fallunterscheidung mehr dazunehmen... usw. ;) - das macht also schon im Ansatz keinen Sinn und ist insofern strikt zu vermeiden.
 

byte

Top Contributor
Warum kannst Du das nicht genauso lösen? Definier doch die Oberklasse Question abstrakt mit der kompletten Schnittstelle, die Du benötigst

Code:
abstract class Question{


  public abstract void display();
  public abstract void save();
  public abstract void reset();
  public abstract void whatever();
  ...
}

Dann hat jede Unterklasse seine eigene Implementierung dieser Methoden und Du brauchst keine Fallunterscheidung machen, weil Du nur mit der Schnittstelle der Oberklasse arbeitest. Manchmal geht das leider nicht, weil man substituieren muss. Aber dann muss man halt erneut überlegen, ob es nicht möglich ist, weitere abstrakte Unterklassen zu bilden.

Ich weiss jetzt natürlich nicht, inwiefern das konform mit Deinen JSP Dateien geht. Aber imo dürfte sich ein Entwurf einer Webanwendung doch nicht so doll von einem "normalen" OO-Entwurf unterscheiden. :)
 

KSG9|sebastian

Top Contributor
@byto: Jo..da bin ich gerade dabei. Das einzige was mich stört ist, dass die Parameter von unteschiedlichen Typen sind.
Z.B. mach ich in der Oberklasse ne abstrake Methode setAnswer(..). In der Klasse TextQuestion ist der Parameter dann ein String, in der Klasse OptionQuestion jedoch ist es eine String-Array.

Code:
class Question{
  abstract void saveAnswer(Object o);
}
class TextQuestion{
   String answer;
  void saveAnswer(Object o){
    this.answer = (String)o;
  }
}
class OptionQuestion{
   private int votes;
   void saveAnswer(Object o){
      String[] arr = (String[])o;
     for(it i=0; i<arr.length; i++{
        // do something
     }
   } 
}
Aber das ist immernoch besser als die Fallunterscheidung. Hab nur gedacht dass es evtl. ne bessere Möglichkeit gibt.

Gruß Sebastian
 

byte

Top Contributor
In diesem Fall könntest Du Dir z.B. wiederum eine Klasse Answer schreiben, die wiederum alle Möglichkeiten einer Antwort kapselt (also String, String Array oder was es sonst noch geben kann). Unter Umständen bietet es sich dort dann wiederum an, Answer abstrakt zu definieren und dann unterschiedliche Implementierungen je nach "Art" der Antwort zu machen.

Dadurch könntest Du in Deinen Questions alle Answers einheitlich behandeln.
 

Wildcard

Top Contributor
Wenn du dir ziemlich sicher bist das da nie was anderes als Strings in beliebiger Anzahl rein kommen, dann nimm Var-Args, Ansonsten sollte die Abstrakte Oberklasse eine Methode mit Object bereitstellen, die die Unterklassen dann zusätzlich konkreter Implementieren können.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
T Super Klasse Vererbung Problem :/ Allgemeine Java-Themen 10
T Problem mit Vererbung Allgemeine Java-Themen 3
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19
T Klassen Override Problem Allgemeine Java-Themen 7
L Unbekanntes Problem Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F HTTPS Zertifikat Problem Allgemeine Java-Themen 3
M OpenCV KNearest Problem Allgemeine Java-Themen 0
Tommy Nightmare Project Euler: Problem 22 Allgemeine Java-Themen 2
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben