2012-01-18 14 views
1

I==演算子を呼び出して子の実装を呼び出す方法は?

public abstract class DataClass 
{ 
    public static bool operator ==(DataClass left, DataClass right) 
    { 
     return left.Equals(right); 
    } 
} 

持っており、これは明示的にキャストせずに、

object left = new DataClass(); 
object right = new DataClass(); 
bool expected = true; 
bool actual; 
actual = ((DataClass)left) == ((DataClass)right); 
Assert.AreEqual(expected, actual); // passes 
actual = left == right; 
Assert.AreEqual(expected, actual); // fails 

はどのようにそれが正しい実装を呼び出す作るために何が起こりますか?

+0

クラスが変更可能であるか、または「封印されていない」場合は、最初に 'operator =='をオーバーライドするのが間違っている可能性があります。この特定のクラスが平等であることが分かっていない限り、常に '==' *の代わりに '' Equals'を使うべきです*。 'object'はこの理想から遠いので、これをしないでください。 – Jon

答えて

8

staticの方法は、多型的挙動の影響を受けない(すなわち、それらはオーバーライドできない)。キャストが必要です。 Override a static method

ほとんどの場合、あなたがインスタンスメソッドを作成するか、代わりにEqualsをオーバーライドに頼る必要があります:可能な回避策については

は、この関連の質問を参照してください。

+0

私はEqualsをオーバーライドしましたが、演算子==はそのように実装しない限りEqualsを呼び出しません。 –

0

演算子は静的で、定義上、仮想/上書きすることはできません。

同じ問題が発生した場合は、bool Equals(object o)をオーバーライドし、オペレータの代わりにメソッドを使用しました。それがオプションでない場合は、キャストが必要です。

関連する問題