0

重複の可能性:
インターフェイスの明示的な実装を公開できないのはなぜですか?

この質問を読みました。質問からそのまま

interface IRepository<T>
{
    void AddString();
}

interface IStringRepo : IRepository<string>
{
    List<string> GetStrings();
}

public class BLL : IStringRepo
{
    public List<string> FilterStrings()
    {
        return new List<string>() { "Hello", "World" };
    }

    public List<string> IStringRepo.GetStrings()
    {
        throw new NotImplementedException();
    }

    public void IRepository<string>.AddString()
    {
        throw new NotImplementedException();
    }
}

明示的に参照されたメンバーをパブリックにするのはなぜErrorですか?

4

3 に答える 3

1

明示的に参照されたメンバーをパブリックにすることがエラーになるのはなぜですか

これは設計によるものです。開発者がインターフェイスを明示的に実装することを余儀なくされる最も一般的な理由の 1 つを想像してみてください:メンバー名のあいまいさ、そのため、何らかの名前でパブリック メンバーを既に公開している既存のクラスがあり、既存のクラスを変更することはできません。クラス API は他のシステムで使用されるため、インターフェイス API (メンバー名/シグネチャ) を変更することはできず、クラスとインターフェイスの両方が同じ名前のメンバーを定義するpublicため、インターフェイス メンバーに accesses 修飾子を提供しても意味がありません。クラスですでに宣言されている同じ名前。

MSDN、13.4.1 明示的なインターフェイス メンバーの実装

メソッド呼び出し、プロパティ アクセス、またはインデクサー アクセスで、完全修飾名を使用して明示的なインターフェイス メンバーの実装にアクセスすることはできません。明示的なインターフェイス メンバーの実装は、インターフェイス インスタンスを介してのみアクセスでき、その場合は単にそのメンバー名によって参照されます。

明示的なインターフェイス メンバーの実装にアクセス修飾子を含めることはコンパイル時エラーであり、abstract、virtual、override、または static 修飾子を含めることはコンパイル時エラーです。

于 2012-04-15T17:39:58.117 に答える
0

彼らは公開されていないので、それは一種の対立です

choice明示的または暗黙的のいずれかの方法で実装 する必要があります。

明示的である場合、それは多くの場合
、実装者がインターフェイスを介してのみアクセスを強制し、パブリックから非表示にする方法(簡略化)を望んでいるためです。したがって、パブリックではありません。

要するに、それは明示的な実装を持つ目的の1つです。

于 2012-04-15T17:48:47.833 に答える
-1

それを作成する理由はありません。それpublicとの契約に署名することにより、他の選択肢がないため、すべてのメンバーをパブリックのように実装します。

しかし、なぜエラーを出すのですか?

単純に、すべてのインターフェイス メンバーが定義により public であるためです。

インターフェース

インターフェイスは、メソッド、プロパティ、イベント、インデクサー、またはこれら 4 つのメンバー型の任意の組み合わせで構成されます。インターフェイスには、定数、フィールド、演算子、インスタンス コンストラクター、デストラクター、または型を含めることはできません。静的メンバーを含めることはできません。インターフェイス メンバーは自動的にパブリックになり、アクセス修飾子を含めることはできません。

于 2012-04-15T17:39:44.817 に答える