継承は本当にメソッドを隠していますか?
-
18-09-2019 - |
質問
私は、次のコンパイラの警告を取得しています
'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended. Resources.NET\Resources\Class1.cs 123 20 Resources
この(非常に簡略化された)コードのための
public interface IFoo
{
int GetType();
string GetDisplayName();
}
public class Foo : IFoo
{
public int GetType() { return 3; } *** Warning: points to here (line 123)***
public string GetDisplayName() { return "Foo"; }
}
注GETDISPLAYNAME()関数が警告を取得していない理由を、私は何を取得しないことです。私は明らかに何かを見下ろすています。
私は、スタックオーバーフローの周りつついと、このエラーをGoogleで検索し、クラスの継承ではなく、インターフェイスに適用するように思われています。これは、(仮想として、そのメソッドを定義します)インターフェイスのためにトリガされるだろう、なぜ私は本当に混乱しています。
洞察力を事前に感謝します。
解決
メソッドGetType の方法は、上に定義されています System.Objectののクラス、どのフレームワークのすべてのクラスの究極の基底クラスです。
この方法は、タイプを取得するために使用されますランタイムでの現在のインスタンスは、と私はあなたが(あなたがint型の戻り値の型を持っている)、それを上書きすることを意図していないと思います。
私はあなたがGetFooTypeする方法または何か他のものの名前を変更することをお勧め、またはあなたのインターフェイスを実装する<のhref = "http://msdn.microsoft.com/en-us/library/aa288461%28VS.71%29.aspx "REL =" nofollowをnoreferrerは ">明示的に実行時の問題を回避するためにを。
他のヒント
これは GetType
に隠し、あなたの方法を指し、オブジェクトからではなく、あなたのインターフェイスから。あなたのクラスは、オブジェクトを継承しIFoo
を実装し、そしてあなたがオブジェクトから継承GetType
を非表示になりますインターフェイスを実装するの暗黙のうちにの両方によっては、GetType
方法を提供する。ので、あなたはまだあなたのインターフェイスメソッドがGetType
呼ばれるようにしたい場合は、Foo
で代わりにの明示のそれを実装することができます:
int IFoo.GetType()
{
return 3;
}
.NETのすべての種類はSystem.Objectから派生します。
System.Objectのは、すでにメソッドGetTypeという名前のメソッドを定義します。あなたは、クラス内の別のメソッド「メソッドGetType」を定義し、誰かがあなたのクラスのオブジェクトを作成した場合、彼らはSystem.Objectのことで利用可能となるGetTypeメソッドを呼び出すことはできません。場合これは、「メソッドGetType」はSystem.Objectの中で定義されたメソッドを隠すという警告を得ている理由です。 System.Objectの(またはそのことについては任意の親クラス)は、このメソッドを定義していないので、あなたはGETDISPLAYNAMEため、この警告を得ることはありません。
私は一般的に、.NET開発者は、GetTypeメソッドの呼び出しがSystem.Objectの実装を参照することを期待して、あなたのメソッド名は、他のものに変更することをお勧めします。
これはむしろ「オブジェクト」にすでにだメソッドGetType(のあなたの再実装を)インタフェースの実装文句ではなく。 「オブジェクト」GETDISPLAYNAMEメソッドを持っているので、その1つのための訴状を提起しません。メソッドの名前を変更するか、それはお勧めできませんけれども、あなたが本当にobject.GetTypeを(非表示にする場合は、「新しい」修飾子)に追加してみてください。
のSystem.Objectクラスが既にメソッドGetType()メソッドを持っている
あなたはこの問題を解決するために、新規またはoverrideキーワードを使用する必要があります。