私はなぜObject.Equals(Object obj)
仮想ですかと思っていた。参照平等のみをチェックする基本Object.Equals(Object obj)
メソッドの代わりに、そのメソッドをオーバーライドして、等価性をチェックする独自のコードを記述することができます。オブジェクトクラス仮想でequalsメソッドが使用されるのはなぜですか?
私が定義した型で私自身の新しいメソッドを実装することができるのはなぜですか?何か特別な理由はありますか?
私はなぜObject.Equals(Object obj)
仮想ですかと思っていた。参照平等のみをチェックする基本Object.Equals(Object obj)
メソッドの代わりに、そのメソッドをオーバーライドして、等価性をチェックする独自のコードを記述することができます。オブジェクトクラス仮想でequalsメソッドが使用されるのはなぜですか?
私が定義した型で私自身の新しいメソッドを実装することができるのはなぜですか?何か特別な理由はありますか?
ポリモーフィズムのために、派生クラスで新しいメソッドを隠すのではなく、任意のメソッドをオーバーライドするのと同じ理由で、これを上書きします。派生クラスが基本クラスについてのみ知っているかもしれない他のコードによってどのように使用されるのか分かりません。
クライアントも、あなたがすべてでクラスをオーバーライドしてきたことを知らないかもしれないが、彼らはすべてがObject
から派生しているため、彼らはあなたのインスタンスでEquals
を呼び出すことができるというを知っていますか。他の新しいメソッドがある場合、インスタンスを使用するコードはそのメソッドを呼び出すことを知らないでしょう。それは仕事でLiskov Substitution Principleです。
私が言うことは、自分の定義した型で私自身の新しいメソッドを実装できるのです。
ことは、言語機能は、開発者が新しい型を作成すると、あなたが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
で定義された新しいメソッドがあり、Object
のEquals
メソッドをオーバーライドしていない場合、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
がチェックされます。
単純な答えでは、C#のすべてがObjectクラスから派生しています。 –
仮想キーワードは、基本クラスで宣言されたメソッド、プロパティ、インデクサ、またはイベントを変更し、派生クラスでオーバーライドできるようにするために使用されます。 overrideキーワードは、基本クラスの仮想/抽象メソッド、プロパティ、インデクサ、またはイベントを派生クラスに拡張または変更するために使用されます。 –
@viveknuna間違っていない限り、単純だが間違っていて、すべてが 'Object'から派生しているわけではありません。 – TheLethalCoder