在微软关于Object.Equals
方法(对象)的 MSDN 库文章 ( http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx ) 中提供了一个示例来演示如何覆盖 Equals。它看起来像这样:
class Point
{
... // IEquatable<Point> is not implemented.
public override bool Equals(Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || ! this.GetType().Equals(obj.GetType())) {
return false;
}
else {
Point p = (Point) obj;
return (x == p.x) && (y == p.y);
}
}
}
sealed class Point3D: Point
{
int z;
public override bool Equals(Object obj)
{
Point3D pt3 = obj as Point3D;
if (pt3 == null)
return false;
else
return base.Equals((Point)obj) && z == pt3.z; // Here!!!
}
}
在随后的文档中,我注意到以下声明。
(如果是Point3D
对象,则将其强制转换为Point
对象并传递给 的基类实现Equals
。)
在这里,return base.Equals((Point)obj)
为什么还要将 obj 转换为Point
?
更新:
我想这可能只是一个错字,当我查看 .NET 4.0 版本文档时,它是单行的:
return base.Equals(obj) && z == ((Point3D)obj).z