2017-07-10 16 views
2

メソッド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()のですか?

+0

Equalsメソッドがオーバーライドされているためです。 – Maarten

+0

'Mortgage'でメソッドをオーバーライドしたため、' a1'が*を参照するオブジェクトの実行時の型は '' Mortgage''です。 –

答えて

4

m1a1は、まだタイプMortgageの同じインスタンスです。

この場合、型システムは、それがまだMortgage.Equalsそれオーバーライドための方法からなる、署名bool (object)に準拠最高由来する方法を見つけるために実際の型を使用して、変数の型が何であるかを気にしないがAssetMortgage.Equalsメソッドnewをマークすると、そのコードはAsset.Equalsとなります。

+0

つまり正しいメソッドと期待されるメソッドが呼び出されます。 – Fabiano

+0

これで、EqualsメソッドをAssetから呼び出す方法は? – HansB

+0

あなたはしません。なぜあなたはそれをしたいのですか? –

関連する問題