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

时间:2009-07-03 18:19:30

标签: c# java .net design-patterns builder

考虑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#中有哪些规则阻止您访问嵌套类的私有属性?

(我意识到人们已经提供了替代here并且那很好。我感兴趣的是为什么你不能不经过修改就使用Java模式。

4 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

C#中的可访问性级别如下:

  • public:访问权限不受限制。
  • protected:访问仅限于从包含类派生的包含类或类型。
  • internal:访问仅限于当前程序集。
  • protected internal:访问仅限于从包含类派生的当前程序集或类型。
  • 私有:访问仅限于包含类型。

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

您可以在以下MSDN文章中找到更多信息:Accessibility Levels (C#)

答案 3 :(得分:0)

允许外部类访问嵌套类私有的Gilad Bracha argues打破了“OO语言类型系统的包含规则。”