25

私は現在取り組んでいるプロジェクトのコードベースをリファクタリングしており、アセンブリの範囲を超えて役に立たないクラス/インターフェイスを(パブリックではなく)内部として宣言する必要があります。しかし、次のコードで問題が発生しました。

internal interface IFirstInterface
{
    ...
}

internal interface ISecondInterface
{
    IFirstInterface First{ get; }
    ...
}

public class Implementer : ISecondInterface
{
    public IFirstInterface First {get; private set;}
    ...
}

私の質問:

  1. 内部インターフェイスのメンバーを公に実装する必要があるのはなぜですか?内部クラスにインターフェースを実装する場合、実装されたメンバーは内部にあるべきではありませんか?クラスが内部であるため、インターフェイスメンバーはとにかくパブリックにアクセスできないため、これは大きな問題ではありません。直感に反しているようです。

  2. 主な問題は上記のシナリオにあります。これは、IFirstInterfaceが内部インターフェイスであるとされているため、パブリックゲッターを使用できないためです。つまり、コンパイラから次のエラーが発生します。

一貫性のないアクセシビリティ:プロパティタイプ「IFirstInterface」は、プロパティ「Implementer.First」よりもアクセスしにくいです。

これを回避する方法はありますか?

:このリファクタリングの演習にはおそらくほとんど価値がないことを認識していますが、内部修飾子の意味をより深く理解するための良い方法だと思いました。

4

3 に答える 3

50

注意してください-は内部クラスであるため、実際に提供したコードコンパイルされます。Implementer問題は、Implementerが公開されているときに発生します。

これを回避する方法は、明示的なインターフェイス実装を使用することです。

public class Implementer : ISecondInferface
{
    private IFirstInterface first;
    IFirstInterface ISecondInterface.First { get { return first; } }
}

セッターを定義しないインターフェースを明示的に実装しているため、そこにセッターを含めることはできません。別の方法としてこれを行うことができます:

public class Implementer : ISecondInterface
{
    internal IFirstInterface First { get; private set; }
    IFirstInterface ISecondInterface.First { get { return First; } }
}

内部インターフェースにパブリックメンバーがあるのは残念です-それはこのようなことを複雑にします。パブリックインターフェイスに内部メンバー(実装者または宣言者の内部にあるもの)があるのは奇妙ですが、内部インターフェイスの場合ははるかに理にかなっています。

于 2009-08-03T09:26:49.913 に答える
11

内部インターフェイスのメンバーを公に実装する必要があるのはなぜですか?

インターフェイスを定義するときは、すべてのインターフェイスメンバーがであるため、メンバーのアクセスレベルを定義しませんpublic。インターフェイス自体がである場合でもinternal、メンバーは引き続き考慮されpublicます。このようなメンバーを暗黙的に実装する場合、署名は一致する必要があるため、である必要がありますpublic

ゲッターの公開に関しては、代わりにインターフェイスを明示的にinternal実装し、値を公開するためのプロパティを作成することをお勧めします。

internal IFirstInterface First { get; private set; }

IFirstInterface ISecondInterface.First
{
    get { return this.First; }
}
于 2009-08-03T09:33:10.910 に答える
7

この投稿が数年前のものであることは承知していますが、パブリック クラスに内部インターフェイスを実装できることは注目に値すると思います。次のリンクを参照してください。

http://forums.create.msdn.com/forums/p/29808/167820.aspx http://msdn.microsoft.com/en-us/library/aa664591%28VS.71%29.aspx

最初のリンクの例:


internal interface ISecretInterface
{
    string Property1 { get; }
}

public class PublicClass : ISecretInterface
{
    // class property
    public string Property1
    {
        get { return "Foo"; }
    }

    // interface property
    string ISecretInterface.Property1
    {
        get { return "Secret"; }
    }
}
于 2011-06-10T16:51:12.143 に答える