等于方法继承混淆

0 c# inheritance

假设我有一个类,通过添加另一个不在的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对象)?这是继承的工作方式吗?

Ser*_*rvy 7

因为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)将是错误的.您可以实现自己喜欢的语义.