-4

重複の可能性:
C#: インターフェイス - 暗黙的および明示的な実装

インターフェイスの再実装について読んでいました。これはどういう意味ですか?「メンバーを暗黙的に実装し、メンバーを明示的に実装する」

サンプルコード:

明示的なメンバーの実装:

public interface IUndoable { void Undo(); }
public class TextBox : IUndoable
{
void IUndoable.Undo() { Console.WriteLine ("TextBox.Undo"); }
}
public class RichTextBox : TextBox, IUndoable
{
public new void Undo() { Console.WriteLine ("RichTextBox.Undo"); }
}

暗黙的なメンバーの実装:

public class TextBox : IUndoable
{
public void Undo() { Console.WriteLine ("TextBox.Undo"); }
}
4

1 に答える 1

7

明示的なインターフェイスの実装により、同じ署名を持つメンバーを持つさまざまなインターフェイスを実装できます。また、インターフェイスの実装を非表示にすることもできます (実装されたメンバーは、インターフェイス タイプの参照を介してのみ使用できます)。

public interface IUndoable 
{ 
   void Undo(); 
}

public interface IVeryUndoable 
{ 
   void Undo(); 
}

public class TextBox : IUndoable, IVeryUndoable
{
     void IUndoable.Undo() { Console.WriteLine ("TextBox.Undo"); }
     void IVeryUndoable.Undo() { Console.WriteLine ("TextBox.VeryUndo"); }
}

この場合Undo()、同じ署名を持つ 2 つのメソッドがあります。しかし.、テキストボックス変数をヒットすると、どのメソッドも利用できなくなります。テキストボックス変数を明示的に実装されたインターフェイス タイプにキャストする必要があります。

 IUndoable undoable = (IUndoable)textbox;
 undoable.Undo(); // now member available

インターフェイスの実装を非表示にするのはなぜですか? オブジェクト API をよりクリーンに保つため。.net の例:List<T>暗黙的IList<T>に実装しますが、非ジェネリックの実装を隠しますIList。したがって、非ジェネリックIListが期待される場所にリストを渡すことができますが、非ジェネリック メソッドのような非ジェネリック メソッドAdd(object value)は適切なジェネリック インターフェイスを汚染しません。

と同じです-名前を付けて明示的に実装IDisposableしたniceメソッドを作成できます(メソッドを呼び出します)。API はきれいになります - のみが表示されます。ただし、オブジェクトはブロックで使用できます。CloseDisposeCloseCloseusing

于 2012-11-15T15:06:20.673 に答える