13

C# でネストされたクラスのインスタンス化を制限する方法はありますか? ネストされたクラスがネストされたクラス以外の他のクラスからインスタンス化されるのを防ぎたいが、他のコードからネストされたクラスへの完全なアクセスを許可したい。

4

6 に答える 6

34

通常、他のクラスに公開したい機能のインターフェイスを作成し、ネストされたクラスを非公開にして、そのインターフェイスを実装します。このようにして、ネストされたクラス定義を非表示のままにすることができます。

public class Outer
{
    private class Nested : IFace
    {
        public Nested(...)
        {
        }
        //interface member implementations...
    }

    public IFace GetNested()
    {
        return new Nested();
    }
}
于 2010-04-29T11:35:36.933 に答える
6

要するに、いいえ、それはできません。「自分の内部または外部からアクセスできる」という意味のアクセシビリティ修飾子「public」と、「自分の内部からアクセスできる」という意味のアクセシビリティ修飾子「private」があります。「自分のすぐ外側にあるものにはアクセスできるが、その外側にはアクセスできない」という意味の修飾子はありません。これは、コンストラクターをマークする必要があるものです。これは、型システムの設計者が有用だと考えた概念ではありません。

このクレイジーな種類のアクセシビリティが必要な理由を説明できますか? おそらく、あなたが望むものを手に入れるためのより良い方法があります。

于 2010-04-29T14:09:32.623 に答える
4

C# 構文には何もないため、それらの間に「コントラクト」のようなものを実装する必要があります。ネストされたクラスがその親のプライベート フィールドにアクセスできるという事実を利用できます。

public class ParentClass
{
  private static Func<FriendClass> _friendContract;

  public class FriendClass
  {
      static FriendClass()
      {
          _friendContract= () => new FriendClass();
      }

      private FriendClass() { }
  }

  ///Usage
  public FriendClass MethodUse()
  {
      var fInstance = _friendContract();
      //fInstance.DoSomething();
      return fInstance;
  }
}

もちろん、コントラクトを調整してさまざまなパラメーターを処理できます

 private static Func<Arg1,Arg2,FriendClass> _friendContract;
于 2014-01-23T21:50:03.150 に答える