1

オーバーライドされたメソッド/プロパティのアクセス指定子の可視性は、基本メソッド/プロパティの可視性と同じかそれ以上でなければならないことを知っています。また、インターフェイスのメンバーの可視性はデフォルトでパブリックであることも知っています。では、クラスオブジェクトを実装されたインターフェイスにキャストすることでこれらのプライベートメソッドにアクセスできるにもかかわらず、クラスにインターフェイスを明示的に実装するときに、メンバーの可視性をプライベートにする方法と理由は何でしょうか。

    public interface IRocker
{
    string RockOff(string str);
}
public abstract class AmAbstract
{
    public abstract string SomeMethod(string str);
}
class Program : AmAbstract, IRocker
{
    static void Main(string[] args)
    {
        new Hello().RockU();
        Console.ReadKey();
    }

    string IRocker.RockOff(string str)
    {
        return str;
    }

    public override string SomeMethod(string str)
    {
        return str;
    }
}

public class Hello
{
    public void RockU()
    {
        Console.WriteLine(((IRocker)(new Program())).RockOff("Damn"));
        Console.WriteLine(((AmAbstract)(new Program())).SomeMethod("lalalalala"));

    }
}

'Console.WriteLine(((IRocker)(new Program()))。RockOff( "Damn"));' ステートメントは、最終的にクラス'Program'のプライベートメソッドにアクセスすることを示しています。私の質問は、インターフェイスメソッドのように抽象メソッドの可視性を隠すことができないのはなぜですか?そして、なぜ私たちはインターフェースを介してプライベートメソッドにアクセスできるのですか?どんな助けでも大歓迎です。

4

1 に答える 1

2

を実装するときに、明示的なインターフェイスの実装を使用していますIRocker.RockOff()。C#のルールには個別のルールがあり、実際、これらは一種のプライベートとパブリックを同時に備えています。

C#4.0仕様のパラグラフ13.4.1からの引用:

明示的なインターフェイスメンバーの実装には、他のメンバーとは異なるアクセシビリティ特性があります。明示的なインターフェイスメンバーの実装は、メソッド呼び出しまたはプロパティアクセスで完全修飾名を介してアクセスできることはないため、ある意味でプライベートです。ただし、インターフェイスインスタンスを介してアクセスできるため、ある意味ではパブリックでもあります。

明示的なインターフェイスメンバーの実装には、次の2つの主な目的があります。

  • 明示的なインターフェイスメンバーの実装には、クラスまたは構造体のインスタンスからアクセスできないため、クラスまたは構造体のパブリックインターフェイスからインターフェイスの実装を除外できます。これは、クラスまたは構造体が、そのクラスまたは構造体のコンシューマーには関係のない内部インターフェースを実装する場合に特に役立ちます。
  • 明示的なインターフェイスメンバーの実装により、同じシグニチャを持つインターフェイスメンバーの曖昧性解消が可能になります。明示的なインターフェイスメンバーの実装がないと、クラスまたは構造体が同じシグニチャとリターンタイプを持つインターフェイスメンバーの異なる実装を持つことは不可能です。クラスまたは構造体がすべてのインターフェイスメンバーで実装を持つことは不可能です。署名は同じですが、戻り値のタイプが異なります。

抽象クラスにはそのような例外はないため、通常の修飾子ルールのみが適用されます。

于 2012-07-12T17:27:08.130 に答える