2017-01-20 8 views
2

私はなぜObject.Equals(Object obj)仮想ですかと思っていた。参照平等のみをチェックする基本Object.Equals(Object obj)メソッドの代わりに、そのメソッドをオーバーライドして、等価性をチェックする独自のコードを記述することができます。オブジェクトクラス仮想でequalsメソッドが使用されるのはなぜですか?

私が定義した型で私自身の新しいメソッドを実装することができるのはなぜですか?何か特別な理由はありますか?

+1

単純な答えでは、C#のすべてがObjectクラスから派生しています。 –

+0

仮想キーワードは、基本クラスで宣言されたメソッド、プロパティ、インデクサ、またはイベントを変更し、派生クラスでオーバーライドできるようにするために使用されます。 overrideキーワードは、基本クラスの仮想/抽象メソッド、プロパティ、インデクサ、またはイベントを派生クラスに拡張または変更するために使用されます。 –

+1

@viveknuna間違っていない限り、単純だが間違っていて、すべてが 'Object'から派生しているわけではありません。 – TheLethalCoder

答えて

1

ポリモーフィズムのために、派生クラスで新しいメソッドを隠すのではなく、任意のメソッドをオーバーライドするのと同じ理由で、これを上書きします。派生クラスが基本クラスについてのみ知っているかもしれない他のコードによってどのように使用されるのか分かりません。

クライアントも、あなたがすべてでクラスをオーバーライドしてきたことを知らないかもしれないが、彼らはすべてがObjectから派生しているため、彼らはあなたのインスタンスでEqualsを呼び出すことができるというを知っていますか。他の新しいメソッドがある場合、インスタンスを使用するコードはそのメソッドを呼び出すことを知らないでしょう。それは仕事でLiskov Substitution Principleです。

1

私が言うことは、自分の定義した型で私自身の新しいメソッドを実装できるのです。

ことは、言語機能は、開発者が新しい型を作成すると、あなたがC#ですべての種類は、Objectから継承しているとObject 2つのオブジェクトの等価性をチェックするために、デフォルトの実装を持つメソッドを定義して知っているように、設計されており、我々されている方法ですのでequalsメソッドが特定の型の2つのオブジェクトをどのように比較するかの振る舞いを変更することができます。ここで

は、それが仮想的である理由を理解するための例です:

int i = 1; 
int j = 1; 
Object o = i; 
o.Equals(j); // now what will happen here if you have'nt overriden it 

intタイプは平等のための2つの整数をチェックEquals方法のオーバーライド実装が含まれているので、私たちはの参照を使用してEqualsメソッドを呼び出しますときObject型で定義されている実装を呼び出すと、System.Int32で定義された新しいメソッドがあり、ObjectEqualsメソッドをオーバーライドしていない場合、Object型の実装でメモをチェックしたため予期しない動作が発生しますryのアドレス、すなわち参照の等価。

同様に、この例を考えてみましょう:

public class Person 
    { 

     private string _name; 

     public string Name 
     { 
      get 
      { 
       return _name; 
      } 
     } 

     public Person(string name) 
     { 
      _name = name; 
     } 

     public override string ToString() 
     { 
      return _name; 
     } 

    } 

何を参照することによってそれらを比較しないようにEquals方法をしたいが、その代わり、我々はそのような場合には、我々はoverrideに必要となる、nameに基づいて、それらを比較したい場合メソッドを使用して、型参照またはPerson型参照のいずれかを呼び出すと、同じ結果が返されます。つまり、参照の等価性はチェックされず、2つのPersonクラスオブジェクトのNameがチェックされます。

関連する問題