Java ArrayList aus abstrakter Klasse gefüllt mit spezifischen Objekten

05/28/2013 16:09 Whoruu#1
Hallo,

Folgende Situation:
Ich programmiere grade für mein Studium ein Point & Click Adventure (nach dem Model View Control Prinzip).

In dem package Model hab ich nun eine abstrakte Klasse Interac diese spezifizier ich in drei Kinderklassen Item, Navigation und Punkte. Dabei ist Interact die generelle Beschreibung von Objekten mit denen später der User "interagiert" bzw. den User zur aktuellen Beschreibung des Spiels informieren.

Ich erstell mir dann jeweils ein Objekt der Kinderklassen und schreib diese in eine ArrayList<Interact>.

In dem package View, der Klasse drawStage möchte ich jetzt die Objekte zeichnenlassen. drawStage wird eine ArrayList von stageObjekten übergeben und jedem stageObjekt bei der Erzeugung die ArrayList<Interact> mit allen "Interactions".

Hier meine [Only registered and activated users can see links. Click Here To Register...] Klasse. (link verweist auf pastebin)

In der For each Schleife geh ich nun alle IteractObjekte einzelnd durch und kann mir deren Klassen zurück geben. Meine Frage ist jetzt wie kann ich jetzt gezielt die einzelnen ObjektTypen ansprechen um weiter spezifisch mit ihnen zu arbeiten?

Vielen dank schonmal für Denkanstöße und Lösungsvorschläge! :)

mfg Whoruu
05/28/2013 16:27 MoepMeep#2
Du solltest mal ein wenig über polymorphie lesen.
05/28/2013 16:37 Netzgeist#3
Wenn du das Design unverändert lassen möchtest:
[Only registered and activated users can see links. Click Here To Register...]

Code:
if (foo instanceof FooObject() { 
((FooObject) foo).fubar() ..
05/28/2013 17:01 Whoruu#4
Ty! :D
05/29/2013 10:08 MrSm!th#5
Ein ziemlich hässlicher Weg.
Gib dem Interface einfach entsprechende Methoden um damit zu arbeiten (draw, move, was auch immer), implementier sie in den Kindklassen und ruf sie dann auf. Es wird automatisch die passende Methode aufgerufen.
Wenn du ohnehin den Typ auf so eine Art abfragen willst, verlierst du den Vorteil der Vererbung und kannst dir das mit dem Interface eigentlich sparen.
05/29/2013 12:55 Netzgeist#6
Diesen "hässlichen" Weg brauchst du spätestenz wenn du clone oder equals überschreiben willst. Von etwas in der Art bin ich ausgegangen. Alles in seiner Liste implementiert ja eh dasselbe Interface, OP wird also irgendwas anderes nach der Typprüfung tun wollen. Grundsätzlich hast du aber recht, Lange if-else Ketten aus instanceof sind schlechter Stil(deshalb auch meine Annotation vor dem Link).
05/29/2013 14:54 MrSm!th#7
Inwiefern soll das für equals und clone notwendig sein?
05/29/2013 17:18 Netzgeist#8
equals:
Code:
return (ob1 instanceof obj2) ? (weitererSinnvollerVergleich) : false;
Bedeutsamer Effizienzgewinn.
clone:
nochmal drüber nachgedacht, man wird ohne auskommen.