继承调用错误的 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()
?
因为m1
和a1
仍然是Mortgage
类型的同一个实例。
在这种情况下,类型系统不关心变量类型是什么,它使用实际类型找到符合签名bool (object)
的最高派生方法,仍然是Mortgage.Equals
因为它 覆盖 来自 Asset
的方法。标记 Mortgage.Equals
方法 new
将使该代码调用 Asset.Equals
.
我对覆盖方法有疑问 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()
?
因为m1
和a1
仍然是Mortgage
类型的同一个实例。
在这种情况下,类型系统不关心变量类型是什么,它使用实际类型找到符合签名bool (object)
的最高派生方法,仍然是Mortgage.Equals
因为它 覆盖 来自 Asset
的方法。标记 Mortgage.Equals
方法 new
将使该代码调用 Asset.Equals
.