質問

Check() メソッドを持つインターフェイス (IMessage と呼びます) があり、クラスはこのインターフェイスを実装しています

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

    public bool Check()
    {
        //Some logic
    }
}

それは大丈夫です。問題は、このメソッド(Check())をパブリックにしたくないので、アセンブリの内部に保持したいのですが、内部にすると、コンパイラはインターフェイスを実装していないと言うことです。インターフェイスを実装するにはパブリックにする必要があります。私に何ができる?

役に立ちましたか?

解決

あなたはを明示的なインターフェイスの実装構文の(のアクセスを削除する修飾子や接頭メソッドへのインタフェース名):

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
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top