web-dev-qa-db-ja.com

クラスに実装されているC#インターフェイスメソッドをパブリックにする必要があるのはなぜですか?

インターフェイスを継承するクラスがあります。インターフェイスメンバーメソッドは、アクセス修飾子なしでクラスに実装されています(したがって、デフォルトではプライベートです)。

「パブリックではないため、インターフェイスメンバーを実装できません」というエラーが発生します。

なぜ許可されないのですか?アクセシビリティを上書きできませんか?

24
Kuntady Nithesh

whyの例を次に示します。可視性をオーバーライドできるようにするのは意味がありません。

interface someI
{
    void doYourWork();
}
public class A : someI
{
    public void doYourWork()
    {
        //...
    }
}

public class B : someI
{
    private void doYourWork()
    {
        //...
    }
}
void Main()
{
    List<someI> workers = getWorkers();
    foreach(var worker in workers)
        worker.doYourWork();
}

労働者のタイプがBの場合はどうなりますか?メソッドをパブリックであるかのように呼び出していますが、それはプライベートメソッドです。この機能が必要な場合は、実際にはプライベートメソッドではありませんか?

インターフェースを介して参照されるときにのみ公開したい場合は、そのように定義できます。

public class B : someI
{
    void someI.doYourWork()
    {
        //...
    }
}

そして、あなたはこれで終わります:

var b = new B();
b.doYourWork(); // Not accessible
((someI)b).doYourWork(); // Accessible
37
Rob

メソッドはpublicを実装する必要があります。これは、メソッドがインターフェースを介して呼び出す必要があるため、インターフェースから型としてアクセスできるためです。

メソッドの可視性を「change」するためのオプションがいくつかあります。与えられた:

public interface IFoo 
{
    bool IsFoo();
}

A.メソッドを実装する明示的に

public class Foo : IFoo
{
    bool IFoo.IsFoo() { return true; }
}

このメソッドは、インターフェース(この場合はIFoo)を介してのみ使用できます。

B.インターフェイスの可視性を変更する

インターフェイスをinternalではなくpublicとして定義します。ただし、その結果、Foointernalにする必要があります。

21
Bryan Menard

インターフェイスの実装をパブリックにすることは、単に論理的な要件です。インターフェイスを実装するときは、コンパイラに「このインターフェイスのすべてのメソッドを実装するね」と伝えます。したがって、メソッドをプライベートにすると、アクセスできなくなります-論理的には実装されません。インターフェイスは、オブジェクトのインターフェイスで定義されているメソッドをいつでも呼び出すことができるという、オブジェクトを使用するコードのコントラクトとして機能します。実装方法がプライベートである場合、それはもはや真実ではありません。

Intellisenseなど、実装を非表示にしたい場合は、@ Bryanが言及しているように、メソッドを明示的に実装するだけです。

6
Paul Alexander