2009-10-20 10 views
5

私は愚かな疑いがあります。一般に "System.Object"は "Equals"を実装しています。私は IEquatableインターフェイスを実装するとき私は私の "等しい"にカスタム定義(私はそう信じる)を与えることができます。.NETの "equals"の内部

異なるSystem.Equalsの定義、およびIEquatableの等号があるので、その教授クラスの実装が

class Professor:System.Object,IEquatable 

に等しい、なぜC#のレポートのエラーではありませんでした?.Because私は「等しい」オーバーライドしておりません新しいキーワードを使って "Equals"を隠すことさえできません。反対しない -

class Professor : IEquatable<Professor> 
{ 

    public string Name { get; set; } 

    public bool Equals(Professor cust) 
    { 
     if (cust == null) return false; 
     return cust.Name == this.Name; 
    } 

} 
+1

IComparableの質問は別の質問として尋ねることをお勧めします。なぜなら、それは設計上の疑問であり、あなたの主な質問は、より大事なことです。NETのオブジェクトモデル。 – Welbog

+0

ok私はそれを行うでしょう – user193276

答えて

8

あなたはどちらのオーバーライドもバージョンがパラメータの型として教授がかかるためObject.Equals()を隠しています。あなたはoverloadingのEquals()メソッドです。

C#では、同じ名前の2つのメソッドが、受け入れられる引数の型によって異なることが認められています。これは、オーバーロードと呼ばれ、コンパイル時の多態性と見ることができます。

Overriding(これは可能性がありますが、やはりそうする必要があります)は、メソッドの実装を基本クラスのバージョンから変更します。これは実行時型多形性の基礎です。

Hidingはに基底クラスのメソッドのバージョンをマスクに派生クラスを可能にあまり一般的な技術です。呼び出しを行うリファレンスのタイプに基づいて(ベースクラス参照によって呼び出される場合)または派生クラスバージョン(派生型参照によって呼び出される場合)のいずれかを取得することができます。

2番目の質問では、参照平等とは別の2つのインスタンスの「同等性」を比較するセマンティクスがある場合は、IEquatable<T>を使用する必要があります。

ご注文商品のセマンティクスがある場合は、IComparableまたはIComparable<T>を実装する必要があります。彼らはより小さい、より大きい、または同等であることを意味します。

+0

それに私を打つ:)私は1つの署名がちょうどより具体的ですが、別のものと互換性があるオーバーロードを持つという考えのまわりでいくつかの混乱に気付きました。 (教授>オブジェクトなど) –

+0

次に、オーバーロードはコンパイル時の多態性であり、オーバーライドは実行時の多形性ですか? – user193276

+0

@generix:可能です。これを読んでください:http://wiki.answers.com/Q/Difference_between_runtime_and_compile_time_polymorphism – LBushkin

1

Object.Equalsメソッドは、オブジェクトとして 'object'というオブジェクトをパラメータとして受け取ります。 Your Equalsメソッドは、パラメータとして 'Professor'タイプのオブジェクトを受け入れます。これらのメソッドは共に存在する可能性があります。なぜなら、2つの同じ名前のメソッドをパラメータリストで区別することが合法であるからです。これはコールメソッドのオーバーロードです。

1

デフォルトのEquals()実装をオーバーライドするだけであれば、IEquatableを明示的に実装する必要はありません。

あなたはちょうどこのような何かを行うことができます。

class Professor 
{ 

    public string Name { get; set; } 

    public override bool Equals(object cust) 
    { 
     if (cust == null || !(cust is Professor)) return false; 
     return cust.Name == this.Name; 
    } 

} 

は、あなたが)(等号をオーバーライドする場合は、また、GetHashCodeメソッドをオーバーライドする必要があることに注意してください()へのハッシングを利用する辞書や他のコレクションの適切な動作を確保するためにオブジェクトを区別する。 MSDNのページguidelines for overriding Equals()はここにあります。