Kiedy przesłanianie metody Equals()
The MSDN recommends this:Przesłanianie równań(): czy zerowe porównanie jest zbędne przy wywołaniu base.Equals()?
class Point: Object {
protected int x, y;
public Point(int X, int Y) {
this.x = X;
this.y = Y;
}
public override bool Equals(Object obj) {
//Check for null and compare run-time types.
if (obj == null || GetType() != obj.GetType()) return false;
Point p = (Point)obj;
return (x == p.x) && (y == p.y);
}
}
Ale jeśli wiemy, że podklasa dziedziczy bezpośrednio od Object
, następnie jest następujący odpowiednik? Zwróć uwagę na !base.Equals()
połączenia:
class Point: Object {
protected int x, y;
public Point(int X, int Y) {
this.x = X;
this.y = Y;
}
public override bool Equals(Object obj) {
if (!base.Equals(obj) || GetType() != obj.GetType()) return false;
Point p = (Point)obj;
return (x == p.x) && (y == p.y);
}
}
Nie, ponieważ '! Base.Equals (obj)' zwróci 'true', co spowoduje, że metoda równań zwróci wartość" false ", jeśli nie są one dokładnie tymi samymi obiektami. Jeśli to ten sam obiekt, to reszta czeku gwarantuje powodzenie. Zasadniczo sprawi, że twoje przesłonięcie nic nie zmieni. – Rob
@Rob - jeśli '! Base.Equals (obj)' zwraca wartość true, to * chcesz *, aby zwrócić wartość false. –
'base.Equals (obj)' sprawdzi, czy bieżący obiekt i obiekt 'obj' są * dokładnie * tym samym obiektem. Oznacza to, że są one wskaźnikami do dokładnie tego samego obiektu w pamięci. Jeśli są to różne obiekty, twoi równi natychmiast zwrócą fałsz. Jeśli * są * tym samym obiektem, to zarówno GetType() == obj.GetType() 'jak i' (x == px) && (y == py) 'są gwarantowane, aby zwrócić' true' – Rob