> Wie bitteschön soll sich Vererbung auf einen Vergleich von Objekten
> *gleichen Typs* auswirken? Und was hat das mit Java zu tun, wo man
> den Vergleichsoporator gar nicht überschreiben, geschweige vererben
> kann?
Ok, ich war nicht genau genug. der Vergleichsoperator kann in Java
*nicht* überschrieben werden (Echt schade da ein Vergleich auf die
selbe Referenz zu 90% unnütz ist).
Problem ist das Vergleiche (in Java dann mit a.equals(b)) nicht
typsicher und nicht trivial sind. Z.B:
"Ich bin ein String".equals(112) == false
Mag zwar "richtig" sein, ist aber nicht typsicher da 112 niemals ein
String ist. Folgendes zeigt das "Problem" das bei Vererbung entstehen
kann.
class Point {
public int x;
public int y;
public boolean equals(Object other) {
if (other instanceof Point) {
Point op = (Point)other;
return this.x == op.x && this.y == op.y;
}
return false;
}
}
class ColoredPoint extends Point {
public int color;
public boolean equals(Object other) {
if (other instanceof ColoredPoint) {
ColoredPoint op = (ColoredPoint)other;
return this.x == op.x && this.y == op.y && this.color == op.color;
}
return false;
}
}
Point p1 = new Point();
p1.x = 1;
p1.y = 1;
ColoredPoint p2 = new ColoredPoint();
p2.x=1;
p2.y=1;
System.out.println(p1.equals(p2)); // true
System.out.println(p2.equals(p1)); // false
Also auch in Java kann man ziemlich leicht unsinnige Vergleiche
anstellen.
Jetzt klar was ich meine?
> *gleichen Typs* auswirken? Und was hat das mit Java zu tun, wo man
> den Vergleichsoporator gar nicht überschreiben, geschweige vererben
> kann?
Ok, ich war nicht genau genug. der Vergleichsoperator kann in Java
*nicht* überschrieben werden (Echt schade da ein Vergleich auf die
selbe Referenz zu 90% unnütz ist).
Problem ist das Vergleiche (in Java dann mit a.equals(b)) nicht
typsicher und nicht trivial sind. Z.B:
"Ich bin ein String".equals(112) == false
Mag zwar "richtig" sein, ist aber nicht typsicher da 112 niemals ein
String ist. Folgendes zeigt das "Problem" das bei Vererbung entstehen
kann.
class Point {
public int x;
public int y;
public boolean equals(Object other) {
if (other instanceof Point) {
Point op = (Point)other;
return this.x == op.x && this.y == op.y;
}
return false;
}
}
class ColoredPoint extends Point {
public int color;
public boolean equals(Object other) {
if (other instanceof ColoredPoint) {
ColoredPoint op = (ColoredPoint)other;
return this.x == op.x && this.y == op.y && this.color == op.color;
}
return false;
}
}
Point p1 = new Point();
p1.x = 1;
p1.y = 1;
ColoredPoint p2 = new ColoredPoint();
p2.x=1;
p2.y=1;
System.out.println(p1.equals(p2)); // true
System.out.println(p2.equals(p1)); // false
Also auch in Java kann man ziemlich leicht unsinnige Vergleiche
anstellen.
Jetzt klar was ich meine?