Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben

ReinhardD

Neues Mitglied
Hallo,

ich bin neu hier. Wenn meine Frage also in einem FAQ oder Tutorial erklärt wird, auf den Link rüberreichen.

Ich hab folgendes Problem:
Ich habe mehrere Klassen. Diese sind unterschiedlich Aufgebaut und werden aus XML-Dateien befüllt. Die Methode zum Befüllen will ich aber nur einmal schreiben. Jetzt habe ich folgende Idee:

Erstellen einer Basisklasse. Ob diese normal, abstrakt oder als Instanz anzulegen ist wäre dann meiner erste Frage. Diese Klasse sieht aktuell so aus:

Code:
public abstract class Datenhalter {
    public abstract void DatenSet(String name, String wert);
}

Die abgeleiteten Klassen werden dann so aufgebaut:
Code:
public class Antworten extends Datenhalter {
   ...
   public void DatenSet(String name, String wert){
      ...
   }
}

Benutzen will ich das dann so:
Code:
List<Antworten> al = new ArrayList<Antworten>();
XMLPullParserHandler parser = new XMLPullParserHandler( (List<Datenhalter>) al);   // Hier knallts!

Und XMLPullParserHandler ist so aufgebaut:
Code:
public class XMLPullParserHandler {
     List<Datenhalter> daten;
     public XMLPullParserHandler(List<Datenhalter> dt) {
        daten = dt;
    }
   ...
}

Ich hoffe es ist klar geworden was ich machen will.

Das klappt aber nicht.

Beim Instanzieren von XMLPullParserHandler bekomme ich die Fehlermeldung "error: incompatible types: List<Antworten> cannot be converted to List<Datenhalter>".

Irgend eine Idee was ich machen muss damit es klappt, oder eine andere Idee wie ich mein Problem lösen kann ohne XMLPullParserHandler mehrfach zu programmieren bzw. ohne mit großen switch-Anweisungen zu arbeiten?
 
Zuletzt bearbeitet:
Warum nicht einfach
Java:
List<Datenhalter> al = new ArrayList<>();
dann lustig neue Antwort-Objekte zur Liste hinzufügen und die Liste deinem XMLPullParserHandler übergeben. Sollte eigentlich klappen.
 
Erstmal danke, damit bekomme ich die Fehlermeldung weg.

Aber es klappt doch nicht weil ich einen Denkfehler gemacht habe.

Es gibt ja noch die Method XMLPullParserHandler.parse() darin passiert im Augenblick etwa folgendes.
Code:
public class XMLPullParserHandler {
   List<Antworten> antworten;
   private Antworten antwort;
   public ... parse(...) {
      antwort = new Antworten();
      ...
      antwort.setId(irgendeinWert);
      ...
      antworten.add(antwort);
   }
}

d.h. ich lege ein passendes Objekt, befülle es, und weise das der Liste zu. Später wird dann setId() mit DatenSet("id", irgendeinWert); ersetzt.

Datenset kann ich aber nicht instanzieren weil es abstract ist. Mach ich das abstract weg wird das DatenSet von Datenhalter aufgerufen, es soll aber das DatenSet von Antworten aufgerufen werden.

Ich muss also ein passendes Objekt anlegen, nur über den Namen. Und dann eine Methode aufrufen, auch nur über den Namen. Unter http://stackoverflow.com/a/160979 hab eich ein passendes Beispiel gefunden. Es geht also.

Aber allmählich wirds kompliziert. Es ist die Frage ob ich wirklich so kompliziert haben will, ich hab gehofft das es einfacher ist.

Ich werd wohl noch 'ne Nacht drüber Schlafen.
 

Zurück
Oben