Überprüfen Sie das Attribut einer Unterklasse
Ich bin über diese Situation gestolpert, weiß aber nicht, wie ich richtig damit umgehen soll:
class Myclass { }
class MyclassWithAwesomeStuff extends Myclass {
public boolean awesomeStuff;
}
Ich speichere die Myclass-Objekte in einer Arrayliste und iteriere später durch diese Liste:
for(Myclass m : list) {
//here I want to check if awesomeStuff is true, in case it is a MyclasswithAwesomeStuff
}
Das Problem hier ist: Die übergeordnete Klasse Myclass kennt das Attribut awesomeStuff nicht (und sollte es auch nicht, da dies eine Funktion ist, die nur mit der abgeleiteten Klasse geliefert wird). Aber wie kann ich das schaffen? Das Problem ist, dass die Arrayliste die Elemente Myclass und MyclassWithAwesomeStuff enthält und die foreach-Schleife sie immer in Myclass umsetzt.
Ich frage mich, ob dies ein Designfehler ist?
//BEARBEITEN:
Okay, um meine Frage ein wenig greifbarer zu machen, hier mehr Infos. Ich versuche ein kleines Café zu bauen:
class Coffee { }
class CoffeeMix extends Coffee {
public boolean shaken;
}
Ich speichere die Kaffee-Artikel in einer Array-Liste:
ArrayList<Coffee> coffees = new ArrayList<Coffee>();
In dieser Array-Liste gibt es also normale Kaffeeobjekte und Kaffee-Mix-Objekte. Jetzt möchte ich alle Kaffee-Mix-Objekte anzeigen, die geschüttelt sind:
for(Coffee c : coffees) {
//here is the same problem as above
}
Wie ich aus den Antworten / Kommentaren ersehen kann: instanceof scheint eine schlechte Idee zu sein, weil es die Idee hinter oo auf den Kopf stellt und eine Schnittstelle, die beide Klassen implementieren, ebenfalls eine schlechte Idee ist, weil ein normaler Kaffee nicht geschüttelt werden kann. Wie geht man damit um?