PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Zwei Typen in einer Liste


Monger
2006-05-29, 20:07:43
Ich bin nicht ganz sicher bei folgendem Problem, deshalb frage ich lieber nochmal nach:

Ich möchte in einer Liste zwei verschiedene Objekttypen haben, die zwar miteinander verwandt sind, aber einige entscheidende Unterschiede haben. Wie muss ich das deklarieren?

Ich versuch mal den Code so aufzuschreiben wie er imo ungefähr aussehen müsste:


// KlasseA und KlasseB erben jeweils von Oberklasse, listeA und
// listeB sind jeweils Instanzen davon


List<Oberklasse> gesamtListe = new ArrayList<Oberklasse>(listeA);
gesamteListe.addAll(listeB);

for(KlasseA liste : gesamtListe){
doSth();
}

for(KlasseB liste : gesamtListe){
doSthElse()
}


Geht das? Dass ich für KlasseA nur doSth() aufrufen kann, für KlasseB aber nicht?

Kabelsalat
2006-05-29, 20:27:58
Ich denke es wird gehen. Zumindest klappt es unter .Net und in solchen Sachen sind sich .Net und Java meistens sehr ähnlich.

HellHorse
2006-05-29, 20:44:35
public abstract class Oberklasse {
public abstract void doIt();
}

public class KlasseA extends Oberklasse {
public void doIt() {
this.doSth();
}
}

public class KlasseB extends Oberklasse {
public void doIt() {
this.doSthElse();
}
}

for(Oberklasse each : gesamtListe) {
each.doIt();
}

Alternativ: Visitor.

Edit:
Interface statt abstrakter Klasse wäre besser ;)

Monger
2006-05-29, 23:14:04
Hmm... vielleicht sollte ich euch einfach das konkrete Problem schildern, vielleicht bin ich ja völlig auf dem Holzweg...


Ich hab mich an einer Stelle designtechnisch vergaloppiert. Ich habe eine Liste mit Elementen, die ihrerseits ein bestimmtes Attribut besitzen. Sagen wir der Einfachheit halber mal das ist eine Klasse "Person" mit dem Attribut "Name".
Jetzt ist es so dass ich festgestellt habe, dass ich eigentlich eine Liste bräuchte, die auch Elemente ohne eingebetteten Namen enthalten kann.

Da ich den Namen aus der Liste schon an sehr vielen Stellen in meinem Code anspreche, suche ich jetzt eine elegante Möglichkeit, die Liste so zu erweitern dass ich meinen bestehenden Code nicht breche, ohne dass ich bei jedem Zugriff auf den Namen auf "null" prüfen müsste.

Deshalb hatte ich halt gehofft, wenn ich meine Liste nur richtig typisiere, dass dann auf bestimmte Einträge in der Liste erst gar nicht zugegriffen wird, wenn der Kontext nicht stimmt.

del_4901
2006-05-30, 05:09:15
Du willst also, das die Objekte sich selbst "handeln". Das geht soweit sogut, solange solange beide Typen die gleichen schnittstellenfunktionen benutzen. Sollte sich aber die handelfunktion von TypA sich von TypB unterscheiden, dann wirds übel, sollte es ein anderer Rückgabetyp sein wird es noch viel viel übler. Also bei ersterem Problem solltest du mit derImplementierung von Horse recht gut klarkommen ... interfaces sind da natürlich noch schoener.
Solltest du letzteres Problem haben, dann hat man's mit Java echt schwer, ich konnte mich nur aus der Misere retten indem ich hoch effiziente c++ Templates verwendet habe.