Ehrlich gesagt ist Vererbung da klassisch Kostet ja nicht viel.
Ehrlich gesagt ist Vererbung da klassisch Kostet ja nicht viel.
Meine Stories:Zitat von Leonard Bernstein
Civ VI aus der Sicht von Civ IV BTS, englischer Weltraumsieg auf König
Der Erste Kaiser wieder aufgenommen
Sieht doch ganz gut aus. Mit diesem equals() und hashCode(), läuft es, oder? Für das Erstellen des neuen Objektes beim Handeln kannst du ja noch eine clone-Methode spendieren.
Geändert von Ramkhamhaeng (20. März 2013 um 21:50 Uhr)
Nein, es sind immer noch 2 unterschiedliche Hashwerte
Vielleicht stimmt ja etwas an meiner Enum nichtPHP-Code:
static public enum WARETYPE {
NONE(0) ,
WOOD(1) ,
STONE(2) ,
METAL(3);
private int id;
WARETYPE(int id){
this.id = id;
}
public int getId(){
return this.id;
}
}
@ Vererbung: Ist das nicht eher umständlich? Ich meine aktuell müsste ich nur einen neuen Enum bei den Konstanten hinzufügen, bei Vererbung müsste ich statt den enums nee neue Klasse hinzufügen
Und wie sehe das ganze aus wenn ich gar die möglichen Waren aus einer Datei lesen möchte. Ich kann ja bei Vererbung schlecht während der Laufzeit eine neue Klasse erstellen.
Du kannst auch schlecht 'ne neue enum (bzw. 'n Eintrag dadrin) erstellen. (Und sowieso, was willst du da einlesen - entweder, du musst das ganze Zeug dafür 'generisch' basteln, oder du hast sowieso schon alles. (Ist verständlich, was ich meine?))
Vererbung ist minimal umständlicher, als die enum erweitern, aber... nehmen tut sichs nicht viel. (Halt neue Datei, code kopieren, und Namen + ID anpassen)
Du hast hashcode unterschiedlich geschrieben. (Java heißt hashCode, deine Methode heißt hashcode) Eventuell liegts dadran.
/e Du musst dir halt mal klar werden, was und wie du willst. (bzw. was du (wirklich) brauchst. )
Hascode stimmt jetzt überein
Aber die Equals Methode gibt jetzt immer noch false aus.
Hab sie schon von WareId zu Object geändert undPHP-Code:
public boolean equals(Object w){
boolean b = false;
if (w instanceof Ware.WareId) {
if (((Ware.WareId) w).getType().equals(this.getType()) && ((Ware.WareId)w).getQuality() == this.getQuality()) {
b = true; } }
return b;
}
Einfach hashCode überprüfen will ich eigentlich nicht, wegen möglichen Kollisionen...
Naja, will ein bisschen Programmieren üben
/e Du musst dir halt mal klar werden, was und wie du willst. (bzw. was du (wirklich) brauchst. )
this.getType? this.get Quality?
Mach doch if w.instanceof(Holz){ w.getQuality() }
Und das soll genau was bringen?
Vor allem hat mir eclipse kein "da fehlt ein @Override" ausgegeben.
Das kommt jetzt unerwartet.
Was ich damit meine (also, nicht, dass ich das von mir kennen würde ): Das Ganze wirkt sehr nach "einfachdrauflosundsehenwasrauskommt" - Was sich gerade bei irgendwas minimal komplexerem sehr schnell rächt.
Überleg dir halt erstmal, was du wie machen willst. Dann sollte dir auch klarer werden, ob enum, Vererbung, oder... irgendwas anderes.
... hach, das lässt sich so schön sagen - irgendwann werd' ich mich auch mal dran halten.
Funktioniert das instanceof da? (Also, geht er ins innere if rein?)
Wenn er eine Oberklasse hätte, ja. Dafür müsste er aber auch wieder wissen, was er will.
Er testet ob type und quality gleich sind (und, ob beide Objekte die richtige Klasse haben) - und alles muss er (mal davon ausgehend, dass type und quality gleich sein sollen).
/e Bei mir tut die equals Methode aber das was sie soll.
Also jetzt geht's anscheinend, aber ich hab keine Ahnung warum
Bei meinen Tests zeigt
boolean resa = s.getWares().containsKey(new Ware.WareId(Constants.WARETYPE.METAL, 2));
immer: false an, später geht es aber trotzdem durch
Es ist immer eine Frage der Abhängigkeiten. Je weniger die Klassen sich gegenseitig kennen müssen, umso besser.
enums haben den Nachteil, das sie statisch sind, ihre Werte müssen zur Kompilerzeit bekannt sein.
Das erste, was man berücksichtigen sollte, ist die Trennung der Daten von der Programmlogik, die mit diesen Daten arbeiten soll.
Warum verwendest du nicht das, was Civ im Prinzip macht? Du erstellst eine Info-Klasse, die die Daten einer Ware verwaltet (die Daten könnten aus einer XML-Datei stammen, wie Civ das macht). Identifizieren kann man die einzelnen Waren anhand ihrer Bezeichnung (z.B. STONE).
Man benötigt dann eine Klasse, die die Info-Objekte verwaltet. Das führt dann im Prinzip auf eine Hashtabelle, die Strings (die Bezeichnungen) auf das jeweilige Info-Objekt abbildet. Für Strings braucht man dann keine eigene Hashfunktion mehr.
Vererbung ist nur dann sinnvoll, wenn jede Ware ein eigenes Verhalten haben muss.