Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't Bloch's Builder Pattern work in C#

Consider a verbatim copy of Bloch's Builder pattern (with changes made for C#'s syntax):

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;
  }
}

If you try to run this, the C# compiler will complain that it doesn't have permission to access the private properties of Builder. However, in Java, you can do this. What rule is different in C# that prevents you from accessing private properties of nested classes?

(I realize that people have given alternatives here and that's great. What I'm interested is why you can't use the Java pattern without modification).

like image 277
cdmckay Avatar asked Jul 03 '09 18:07

cdmckay


1 Answers

In Java private members of inner/nested classes are accessible to the containing class. In C# they aren't.

like image 191
Laurence Gonsalves Avatar answered Oct 14 '22 06:10

Laurence Gonsalves