假设我有一个类,通过添加另一个不在的ClassB类来扩展另一个类.以下等于方法的工作吗?ClassAClassA
public bool Equals(ClassB other)
{
return this.ExtraProp == other.ExtraProp && base.Equals(ClassB);
}
Run Code Online (Sandbox Code Playgroud)
为什么我应该被允许将ClassB对象传递给equals方法ClassA(只接受ClassA对象)?这是继承的工作方式吗?
因为ClassB对象是一个ClassA对象.您可以随时随地将ClassB对象视为ClassA对象.这是多态的本质.
至于它是否真的会返回正确的结果,那将取决于你的实现ClassA.某些实现不会像这个代码期望的那样工作,但是其他实现会.
我们在这里使用一个具体的例子.让我们说这是以下定义ClassA:
public class ClassA
{
public int first;
public int second;
public bool Equals(ClassA other)
{
if (other == null) return false;
return first == other.first &&
second == other.second;
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们说我们有这些对象:
ClassA a = new ClassA() { first = 1, second = 2 };
ClassB b = new ClassB() { first = 1, second = 2, third = 3 };
Run Code Online (Sandbox Code Playgroud)
这a.Equals(b)将是true.它具有两个要检查的属性,因此它认为它们是相同的.你想要这些对象被认为是平等的吗?
另一个实现是这样做:
public bool Equals(ClassA other)
{
if (other == null) return false;
if (other.GetType() != typeof(ClassA)) return false;
return first == other.first &&
second == other.second;
}
Run Code Online (Sandbox Code Playgroud)
这里我们明确地检查(在运行时,在运行时,而不是在编译时),以确保另一个实例不是更多派生类型.在这种情况下a.Equals(b)将是错误的.您可以实现自己喜欢的语义.