インターフェイス メンバーを実装するには、明示的と暗黙的の 2 つの方法があります。
明示的: http://msdn.microsoft.com/en-us/library/aa288461%28v=vs.71%29.aspx
暗黙: http://msdn.microsoft.com/en-us/library/aa664590%28v=vs.71%29.aspx
明示的な利点は次のとおりです。変数/メンバーのコンパイル時の型(宣言された型) がインターフェイスを実装するクラスである場合、明示的に実装されたメンバーを直接呼び出すことはできません。そのためにはインターフェイス参照が必要です。ただし、クラスまたは構造体変数をインターフェイス型にキャストしようとしてキャストしないでください。代わりに、インターフェイスの使用パターンを適切に使用する必要があります。インターフェイスは強力な抽象化ツールであり、実装を知ることから一部のコードを抽象化できます。つまり、コードのこの部分は実装に依存せず、インターフェイスを実装する構造体オブジェクトのクラス参照を受け取ることはなく、インターフェイス ポインターのみを受け取る必要があります。
interface MyInterface {
void MyMethod(/*...*/);
int MyOtherMethod(/*...*/);
string MyProperty { get; set; }
}
class MyImplementation : MyInterface {
// explicit implementations:
void MyInterface.MyMethod (/*...*/) { /* ... */ }
string MyInterface.MyProperty { get { return /*...*/; } set { something = value; /*...*/ } }
// or even implicit:
public int MyOtherMethod(/*...*/) { /* ... */ return /*...*/; }
// Now, even you may have some public (better be internal) members,
// they should not be used in implementation-agnostic code
internal void SomeNonInterfaceMethod(/*...*/) { /*...*/ }
}
//...
MyInterface myImplementation = new MyImplementation(/*...*/);
// NOT MyInterface myImplementation = new MyImplementation(/*...*/);
//...
//some implementation-agnostic method:
void SomeUsingMethod(MyInterface implementation) { // NOT MyImplementation implementation
// it would kill the abstraction
implementation.MyMethod(/*...*/);
implementation.MyProperty = "some value";
// but you cannot call
// implementation.SomeNonInterfaceMethod(/*...*/); // won't work
// if somewhere you need to do this
MyImplementation violatedEncapsulationImplementation = (MyImplementation)implementation; // AVOID IT!
violatedEncapsulationImplementation.SomeNonInterfaceMethod(/*...*/); // AVOID IT!
// it would work, but it would be an indication of wrong code design
}
これで、基本的な考え方がわかりました。