【发布时间】:2018-03-27 00:58:47
【问题描述】:
在为自定义对象编写自己的相等逻辑时,可以做一些事情。其中两种做法包括重载== 运算符和覆盖obj.Equals() 方法。
下面,我们只对父类Animal 和子类Hominoidea 执行此操作。
public class Animal
{
public static bool operator ==(Animal x, Animal y)
{
return object.Equals(x, y);
}
public override bool Equals(object obj)
{ ... }
...
}
public class Hominoidea : Animal
{
public static bool operator ==(Hominoidea x, Hominoidea y)
{
return object.Equals(x, y);
}
public override bool Equals(object obj)
{ ... }
...
}
如果我们能够轻松地比较某种动物而不管它们的派生类(人科、猫科等),我们会利用基类的简单逻辑,可能会写一些类似的东西:
static void DisplayWhetherEqual(Animal animal1, Animal animal2)
{
if (animal1 == animal2)
{
Console.WriteLine(string.Format("{0,12} == {1}", animal1, animal2));
}
else
Console.WriteLine(string.Format("{0,12} != {1}", animal1, animal2));
}
如果我们传入Hominoidea对象,代码将首先为Animal类执行static重载==,然后为子类Hominoidea类执行虚拟object.Equals(x, y)。
当将这两个Hominoidea 类与Animals 进行比较时,编译器如何在static 运算符方法中调用正确的虚拟object.Equals() 方法?我认为@ 中的所有内容987654339@ 方法也必须是static?
【问题讨论】:
-
想象一下,如果你叫
x.Equals(y)而不是object.Equals(x, y) -
您的两个
==重载都调用相同的static 方法。 -
查看
object.Equals的实现 -
您可能还想阅读this question. 的答案(尤其是 Eric Lippert 的答案)
标签: c# .net static overriding overloading