1

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

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

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

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

4

4 に答える 4

8

明示的なインターフェイス実装構文を使用することにより、クラスの直接パブリックインターフェイスの一部にすることなくインターフェイスメソッドを実装できます(アクセス修飾子を削除し、メソッドの前にインターフェイス名を付けます)。

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    bool IMessage.Check()  { }
}

ただし、インターフェイスにキャストできる人は誰でもIMessageCheck()を呼び出すことができます。これは、メソッドの呼び出しを防ぐ方法ではなく、クラスのパブリックインターフェイスを整理する方法にすぎません。インターフェイスがアセンブリの内部にある場合、そのアセンブリ内のクラスのみがインターフェイスにキャストしてメソッドを呼び出すことができます。

一般に、.NETは、インターフェイスの実装の内部にあるインターフェイスの特定のメソッドのみを作成する方法を提供していません。これは、抽象基本クラスを検討する場合の1つの領域です。そこでは、継承者が外部の呼び出し元に公開せずに実装できる保護された抽象メソッドを作成できます。例えば:

abstract class MessageBase
{
    protected abstract bool Check();
}

class NewClass : MessageBase
{
    protected override bool Check() { ... }
}
于 2009-12-26T16:21:36.700 に答える
2

インターフェースとは、他のオブジェクトが公的な方法でそのタイプのオブジェクトとどのようにインターフェースするかということです。他のクラスがCheck()メソッドにアクセスしてはならない場合、それはインターフェースの一部であってはなりません。

これが役立つかもしれないこのトピックのMSDNディスカッションです。

于 2009-12-26T16:18:16.567 に答える
1
class NewClass : IMessage
{
    #region IMessage Members

    internal bool Check()
    {
        //Some logic
    }
    bool IMessage.Check()
    {
        return this.Check();
    }
}

これにより、そのアセンブリ内のクラスでのみ使用可能な内部実装に加えて、インターフェイスの要件を満たすことができる明示的なインターフェイス実装が提供されます。外部アセンブリからのコードがメソッドを呼び出すには、参照ではなく、クラスへCheckの参照が必要になります。IMessageNewClass

于 2009-12-26T16:20:30.057 に答える
1

または、基本クラスで抽象メソッドを使用することもできます。

public abstract class Message
{
    internal abstract bool Check();
}

public class MyMessage : Message
{
    internal override bool Check()
    {
        // do stuff
    }
}
于 2009-12-26T16:25:22.823 に答える