Pourquoi le motif de construction de Bloch ne fonctionne-t-il pas en C #?

Prenons une copie exacte du motif de construction de Bloch (avec les modifications apscopes à la syntaxe de C #):

public class NusortingtionFacts { 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 NusortingtionFacts Build() { return new NusortingtionFacts(this); } } private NuisortingtionFacts(Builder builder) { ServingSize = builder.ServingSize; Servings = builder.Servings; Calories = builder.Calories; } } 

Si vous essayez de l’exécuter, le compilateur C # se plaindra de ne pas être autorisé à accéder aux propriétés privées de Builder. Cependant, en Java, vous pouvez le faire. Quelle règle différente en C # vous empêche d’accéder aux propriétés privées des classes nestedes?

(Je me rends compte que les gens ont donné des alternatives ici et c’est génial. Ce qui m’intéresse, c’est pourquoi vous ne pouvez pas utiliser le modèle Java sans modification).

En Java, les membres privés des classes internes / nestedes sont accessibles à la classe qui les contient. En C #, ils ne le sont pas.

Je ne vois pas pourquoi cela devrait être autorisé à comstackr. Vous essayez d’accéder aux champs privés d’une classe en dehors de cette classe. Java, cependant, contient une règle spéciale pour les classes nestedes qui autorise l’access à partir de la classe externe.

Les niveaux d’accessibilité en C # sont les suivants:

  • public: l’access n’est pas restreint.
  • protected: l’access est limité à la classe contenant ou aux types dérivés de la classe contenant.
  • internal: l’access est limité à l’assembly en cours.
  • protected internal: l’access est limité à l’assembly actuel ou aux types dérivés de la classe contenue.
  • private : l’access est limité au type contenant.

Il n’y a pas de cas particulier en C # pour les classes nestedes; par conséquent, vous ne pouvez pas accéder à un membre privé situé en dehors de cette classe ni à aucune classe dérivant de cette classe.

Vous trouverez plus d’informations dans l’article MSDN suivant: Niveaux d’accessibilité (C #)

Gilad Bracha affirme que le fait d’ autoriser les classes externes à accéder aux parties privatives des classes nestedes enfreint “la règle de subsomption des systèmes de types pour les langues OO”.