11

Bloch の Builder パターン (C# の構文に変更を加えたもの) のそのままのコピーを検討してください。

public class NutritionFacts
{
  public int ServingSize { get; private set; }
  public int Servings { get; private set; }
  public int Calories { get; private set; }
  ...
  public class Builder
  {
    private int ServingSize { get; set; }
    private int Servings { get; set; }
    private int Calories { get; set; }

    public Builder(int servingSize, int servings)
    {
      ServingSize = servingSize;
      Servings = servings;
    }

    public Builder Calories(int calories)
    { Calories = calories; return this; }

    public NutritionFacts Build()
    {
      return new NutritionFacts(this);
    }
  }

  private NuitritionFacts(Builder builder)
  {
    ServingSize = builder.ServingSize;
    Servings = builder.Servings;
    Calories = builder.Calories;
  }
}

これを実行しようとすると、C# コンパイラは、Builder のプライベート プロパティにアクセスする権限がないことを訴えます。ただし、Java ではこれを行うことができます。入れ子になったクラスのプライベート プロパティにアクセスできないようにする C# の違いは何ですか?

(私は、人々がここで代替案を提供していることを理解しています。それは素晴らしいことです。私が興味を持っているのは、修正なしでは Java パターンを使用できない理由です)。

4

4 に答える 4

3

C# のアクセシビリティ レベルは次のとおりです。

  • public: アクセスは制限されません。
  • protected: アクセスは、含まれているクラスまたは含まれているクラスから派生した型に制限されます。
  • internal: アクセスは現在のアセンブリに限定されます。
  • protected internal: アクセスは、現在のアセンブリまたはそれを含むクラスから派生した型に限定されます。
  • private : アクセスは含まれている型に限定されます。

C# では、ネストされたクラスの特別なケースはありません。その結果、そのクラスまたはそのクラスから派生したクラスの外部からプライベート メンバーにアクセスすることはできません。

詳細については、次の MSDN 記事を参照してください:アクセシビリティ レベル (C#)

于 2009-07-03T18:32:35.490 に答える
0

Gilad Bracha、ネストされたクラスの private への外部クラスのアクセスを許可すると、「OO 言語の型システムの包摂規則」が破られると主張しています。

于 2009-07-03T18:38:52.610 に答える