Object中包含两个Equals方法,全部都是virtual方法,其中一个是静态的。在ChildClassLevel2你是override Equals(object)方法,还是定义了新的Equals方法?如果定义新方法,参数类型不能是object。
ChildClassLevel4和ChildClassLevel2是同样的道理。在《C# Primer》是lippman有关于方法的相关说明,你可以看一下。按照你的类结构,ChildClassLevel4没有精确匹配,会在当前类查找是否可以使用类型转换找到类似方法,如果当前类找不到会到父类中查找,依此类推。1、Equals实现,完全根据功能需要,不必须调用base.Equals方法。2、不会出错。ChildClassLevel4中使用base.Equals方法,调用的是ChildClassLevel2的Equals方法。(前提是:要保证参数列表相同)
ChildClassLevel4和ChildClassLevel2是同样的道理。在《C# Primer》是lippman有关于方法的相关说明,你可以看一下。按照你的类结构,ChildClassLevel4没有精确匹配,会在当前类查找是否可以使用类型转换找到类似方法,如果当前类找不到会到父类中查找,依此类推。1、Equals实现,完全根据功能需要,不必须调用base.Equals方法。2、不会出错。ChildClassLevel4中使用base.Equals方法,调用的是ChildClassLevel2的Equals方法。(前提是:要保证参数列表相同)
Jeffrey Richter对关于对象比较问题解释的很详细,也很准确!
好象是第6章节!
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Startup
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
First f1 = new First();
Second s1 = new Second();
Third t1 = new Third();
Forth fo = new Forth(); Console.WriteLine("{0}Class First", Environment.NewLine);
f1.Equals(1); Console.WriteLine("{0}Class Second", Environment.NewLine);
s1.Equals(1); Console.WriteLine("{0}Class Third", Environment.NewLine);
t1.Equals(1); Console.WriteLine("{0}Class Forth", Environment.NewLine);
fo.Equals(1); Console.ReadLine();
}
} #region test class class First
{
} class Second : First
{
public override bool Equals(object obj)
{
Console.WriteLine("Second - Equals");
return true;
} public override int GetHashCode()
{
return base.GetHashCode ();
}
} class Third : Second
{
} class Forth : Third
{
public override bool Equals(object obj)
{
Console.WriteLine("Forth - Equals");
return base.Equals (obj);
} public override int GetHashCode()
{
return base.GetHashCode ();
}
} #endregion
}
Second - EqualsClass Third
Second - EqualsClass Forth
Forth - Equals
Second - Equals
to magiccoder
看看先。
其实,这部分应该属于C#部分,纯语言的,和平台无关。
当然C#是基于.net framework的,你的建议也有道理。