質問
Check() メソッドを持つインターフェイス (IMessage と呼びます) があり、クラスはこのインターフェイスを実装しています
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
#region IMessage Members
public bool Check()
{
//Some logic
}
}
それは大丈夫です。問題は、このメソッド(Check())をパブリックにしたくないので、アセンブリの内部に保持したいのですが、内部にすると、コンパイラはインターフェイスを実装していないと言うことです。インターフェイスを実装するにはパブリックにする必要があります。私に何ができる?
解決
あなたはを明示的なインターフェイスの実装構文の(のアクセスを削除する修飾子や接頭メソッドへのインタフェース名を使用して、クラスの直接のパブリックインターフェイスのそれ一部をせずにインターフェイスメソッドを実装することができますEM>):
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
bool IMessage.Check() { }
}
しかし、IMessage
インターフェイスにキャストすることができ、誰もが、まだチェックを呼び出すことができます()。唯一のクラスのパブリックインターフェイスをdeclutteringの - これは、メソッドの呼び出しを防止する方法ではありません。インタフェースは、アセンブリの内部にある場合は、そのアセンブリ内のクラスのみがそれにキャストしてメソッドを呼び出すことができます。
は一般的に、.NETは、インターフェースのインプリメンテーションへの内部インターフェイスのみ特定の方法を行うための方法を提供しません。そこにあなたが相続が外部発信者にそれらをさらすことなく実装することができ、保護抽象メソッドを作成することができます - これは抽象基本クラスを検討する必要があります一つの領域です。たとえばます:
abstract class MessageBase
{
protected abstract bool Check();
}
class NewClass : MessageBase
{
protected override bool Check() { ... }
}
他のヒント
のインターフェイスは、他のオブジェクトが公共の方法で、オブジェクトの種類とインタフェースする方法についてすべてです。他のクラスはCheck()
メソッドにアクセスしてはならない場合、そのインターフェイスの一部ではありません。
ここで MSDNの議論があります役立つかもしれないこのトピックのます。
class NewClass : IMessage
{
#region IMessage Members
internal bool Check()
{
//Some logic
}
bool IMessage.Check()
{
return this.Check();
}
}
これにより、そのアセンブリ内のクラスでのみ利用可能な内部実装が提供されます。 明示的なインターフェースの実装 これにより、インターフェイスの要件を満たすことができます。外部アセンブリからのコードを呼び出す場合、 Check
メソッドの場合は、 IMessage
ではなく、クラスへの参照 NewClass
参照。
また、あなたは、基本クラスに抽象メソッドを使用することができます:
public abstract class Message
{
internal abstract bool Check();
}
public class MyMessage : Message
{
internal override bool Check()
{
// do stuff
}
}