代码之家  ›  专栏  ›  技术社区  ›  cdmckay

为什么Bloch的Builder模式不能在C中工作#

  •  11
  • cdmckay  · 技术社区  · 15 年前

    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#编译器将抱怨它没有访问生成器私有属性的权限。但是,在Java中,您可以这样做。C#中有什么不同的规则阻止您访问嵌套类的私有属性?

    (我意识到人们已经给出了选择 here

    4 回复  |  直到 7 年前
        1
  •  19
  •   Laurence Gonsalves    15 年前

    在Java中,包含类可以访问内部/嵌套类的私有成员。在C#中,它们不是。

        2
  •  3
  •   JoshJordan    15 年前

    我不明白为什么应该允许编译它。您正试图从该类外部访问该类的私有字段。但是,Java包含一个用于嵌套类的特殊规则,该规则允许从外部类进行访问。

        3
  •  3
  •   Richard McGuire    15 年前

    • 公共:访问不受限制。
    • 受保护:访问仅限于包含类或从包含类派生的类型。
    • 内部:访问权限仅限于当前程序集。
    • 受保护的内部:访问仅限于从包含类派生的当前程序集或类型。
    • :访问仅限于包含类型。

    对于嵌套类,C#中没有特殊情况,因此您无法从该类外部或从该类派生的任何类访问私有成员。

    Accessibility Levels (C#)

        4
  •  0
  •   Tom Hawtin - tackline    15 年前

    吉拉德·布拉卡 argues