一般的に、.NET は 3 つの異なるインターフェイス実装方法、つまり、暗黙的なインターフェイス実装、明示的なインターフェイス実装、および混合インターフェイス実装を提供します。これら 3 つの方法にはそれぞれ独自の特徴があります。
まず、暗黙的なインターフェイス実装を見てみましょう。暗黙的なインターフェイス実装は .NET のデフォルトのインターフェイス実装であるため、これはおそらく最も一般的に使用されるインターフェイス実装です。暗黙的なインターフェイス実装の例を見てみましょう:
using System;
internal class MyClass
{
public void SomeMethod()
{
// インターフェイスを使用して Myinplement オブジェクトを宣言します
IMyInterface iObj = new MyInplement( );
iObj.MethodA();
// クラスメソッドを使用して Myinplement オブジェクトを宣言します
MyInplement obj = new MyInplement();
obj.MethodB();
}
}
public class MyInplement : IMyInterface
{
#領域 IMyInterfaceメンバー
///
/// 暗黙的なインターフェイス実装を使用してインターフェイスにメソッドを実装します
///
public void MethodA()
{
Console.WriteLine("a ");
}
///
/// 暗黙的なインターフェイス実装を使用してインターフェイス内のメソッドを実装します
///
public void MethodB()
{
Console.WriteLine( "B" );
}
#endregion
}
public Interface IMyInterface
{
void MethodA();
void MethodB();
}
上記のコードは非常に単純で、インターフェイスを宣言し、MyImplement クラスを使用して実装します。インターフェース。インターフェイスを実装するときは、暗黙的なインターフェイス実装を選択しました。つまり、インターフェイスで定義されたメソッド シグネチャの前に修飾子を追加して、実装メソッドのシグネチャ (public void MethodB() など) を定義します。 この暗黙的なインターフェイス実装は使用するのが非常に簡単ですが、欠点の 1 つは、顧客がインターフェイスを介してメソッドを呼び出すのではなく、実装クラスのメソッドを直接呼び出す (つまり、MyInplement obj = new MyInplement () を介してオブジェクトを宣言する) ことができることです。実装クラス (つまり、IMyInterface iObj = new MyInplement (); を通じてオブジェクトを宣言する) は、間違いなくコードの結合を増加させ、インターフェイス指向プログラミングの原則に違反します。では、顧客が実装クラスを直接呼び出すことを防ぐにはどうすればよいでしょうか? 以下で説明する明示的なインターフェイスの実装で十分です。
明示的なインターフェイス実装とは、実装クラスがインターフェイス メソッドを実装するときに、「インターフェイス名.メソッド名」スタイルを使用してメソッドのシグネチャ内でメソッド名を定義することを意味します。同時に、修飾子はメソッド内で許可されません。明示的なインターフェイスによって実装されるすべてのメソッドはプライベートであるため、これは顧客が実装クラスを直接呼び出すことを防ぐために .NET によって厳密に規定されているためです。明示的なインターフェイス実装の例を見てみましょう:
using System;
internal class MyClass
{
public void SomeMethod()
{
// インターフェイスを使用して Myinplement オブジェクトを宣言します
IMyInterface iObj = new MyInplement(); iObj.MethodA();
// MyImplement の MethodA メソッドは private であるため、クラス メソッドを使用して Myinplement オブジェクトを宣言するとエラーが報告されます
MyInplement obj = new MyInplement();
obj.MethodB();
}
}
public class MyInplement : IMyInterface
{
#region IMyInterface Members
///
/// 明示的なインターフェイス実装を使用してインターフェイス内のメソッドを実装します
///
void IMyInterface.MethodA ( )
{
Console.WriteLine("a");
}
///
/// 明示的なインターフェイス実装を使用してインターフェイスにメソッドを実装すると、
/// 明示的なインターフェイスの実装によりエラーが報告されます。インターフェイスを実装する場合、修飾子は許可されません
///
public void IMyInterface.MethodB()
{
Console.WriteLine("B");
}
#endregion
}
public Interface IMyInterface
{
void MethodA();
void MethodB();
}
internal class MyClass
{
public void SomeMethod()
{
// インターフェイスを使用して、Myinplement オブジェクトを宣言します
IMyInterface iObj = new MyInplement();
iObj.MethodA();
// クラスを使用して、Myinplement オブジェクトを宣言します。いいえ、MethodA メソッドが使用されているため、エラーが報告されます。 MyImplement は public
MyInplement obj = new MyInplement();
obj.MethodB();
}
}
public class MyInplement : IMyInterface
{
#region IMyInterface Members
///
///
void IMyInterface.MethodA()
{
Console.WriteLine("a");
}
///
// / 暗黙的なインターフェイス実装を使用してインターフェイスにメソッドを実装します
///
public void MethodB()
{
Console.WriteLine("B");
}
# endregion
}
public Interface IMyInterface
{
void MethodA();
void MethodB();
}
上記のコードでは、MehtodB の実装を暗黙的なインターフェイス実装に変更したため、MyImplement.Method の修飾子は public になり、コードにエラーは発生しません。