2012-02-28 42 views
1

Visual Studioは、インターフェイスの観点から明示的に宣言しないと、メソッドを実装しないと伝えます。 ここに私の方法は、以下のとおりです。明示的にインターフェイスを定義する

List<Menu> IGetMenus.GetMyMenus() 
    { 
    } 

それはなぜです:

ここ
public interface IGetMenus 
{ 
    List<Menu> GetMyMenus(); 
    void InsertMenu(string topic, string subTopic); 
    void UpdateMainMenu(int menu_id, string topic); 
    void UpdateSubMenu(int menu_id, string topic); 
} 

は、インターフェイスを実装するために私を望んでいるかのVisual Studioの一例ですか?

+0

あなたのクラスは既にクラスを継承していますか、同じメソッド宣言を持つ別のインターフェイス( 'IGetMenus'ではなく)を実装していますか? –

+2

しかし、インターフェイスを実装するクラスはどこですか? – vulkanino

+0

私はこの質問が以前に存在していたことを知りませんでした。なぜインターフェイスを明示的に実装するのか知っていますが、同じ名前のメソッドはありません...私はそれを知っています..thanks – BlackFire27

答えて

4

通常、同じ名前+パラメータを持ち、戻り値の型が異なるメソッドがあるためです。

これは無効です。この場合、インターフェイスを実装する唯一の方法は、明示的に行うか、他のメソッドを移動/名前変更することです。

2

良い例は、クラスが呼び出したいかどうかを確認する方法です。これは通常、必要な機能を追加しない高価な方法です。

ObjectCacheが良い例です。暗黙のメソッドを使用して項目を追加、削除、およびチェックすることができます。 しかし、列挙子は明示的に定義されています。

foreach(var item in (ObjectCache as Enumerator)) 
{ 
    ... 
} 

明示的に行うことなくキャッシュ全体を列挙するだけでなく、

+0

非常に良い例は、次回はなぜ明示的な実装が必要なのか尋ねられますが、このケースではVSは明示的な実装を要求しているようですが、通常はメソッドシグネチャを複製します – ntziolis

0

メンバーを明示的に実装するときに注意すべき重要な点は、派生クラスが親クラスの明示的に実装されたインターフェイスメンバーをオーバーライドすることができないことですBaseClassIFoo.Fooを明示的に実装している場合、DerivedClassがそれ自体を実装するための唯一の方法はIFoo.Fooで、派生クラスがそうした場合はIFoo.Fooが派生クラスのメソッドを参照し、IFoo.Fooの実装にアクセスできません。親クラス)。そのため、派生クラスのメンバーを親クラスの実装に連鎖させる必要がある場合は、インターフェイスメンバ実装の「要点」をprotected virtualメンバに配置して、明示的に実装することをお勧めします。それによって単にprotected virtualが呼び出されます。これにより、派生したクラスがそのメンバとそのメンバをオーバーライドすることができます。

関連する問題