继承调用错误的 Equals() 方法

Inheritance calling wrong Equals() method

我对覆盖方法有疑问 Equals

public class Asset
{
    public string Name { get; set; }

    public override bool Equals(object obj)
    {
        Asset oAss = (Asset)obj;
        return Name == oAss.Name;
    }
}

public class Mortage : Asset
{
    public int Amount { get; set; }

    public override bool Equals(object obj)
    {
        Mortage oMor = (Mortage)obj;
        return this.Name == oMor.Name && this.Amount == oMor.Amount;
    }
}

    static void Main(string[] args)
    {
        Mortage m1 = new Mortage();
        Mortage m2 = new Mortage();

        m1.Name = "House";
        m1.Amount = 2000;

        m2.Name = "Castle";
        m2.Amount = 200000;


        Asset a1 = m1;
        Asset a2 = m2;


        m1.Equals(m2);
        a1.Equals(a2);

    }

为什么当我调用方法 a1.Equals(a2) 时调用的是 Mortage.Equals() 而不是 Asset.Equals()

因为m1a1仍然是Mortgage类型的同一个实例。

在这种情况下,类型系统不关心变量类型是什么,它使用实际类型找到符合签名bool (object)的最高派生方法,仍然是Mortgage.Equals 因为它 覆盖 来自 Asset 的方法。标记 Mortgage.Equals 方法 new 将使该代码调用 Asset.Equals.