11
votes

Pourquoi le modèle de constructeur de Bloch ne fonctionne-t-il pas dans C #

Considérez une copie de verbatim du modèle de constructeur de Bloch (avec modifications apportées à la syntaxe de C #): xxx

Si vous essayez de l'exécuter, le compilateur C # se plaint qu'il n'a pas la permission pour accéder aux propriétés privées du constructeur. Cependant, en Java, vous pouvez le faire. Dans quelle règle est différente dans C # qui vous empêche d'accéder à des propriétés privées de classes imbriquées?

(Je me rends compte que les gens ont donné des alternatives ici et c'est génial. Ce que je suis intéressé, c'est pourquoi vous ne pouvez pas utiliser le motif Java sans modification).


1 commentaires

Salut j'ai posé cette question exacte.Got Certaines de bonnes réponses. Ici, nous allons http://stackoverflow.com/questions/512651 / how-is-javas-notio N-de-statique-Differ T-de-CS


4 Réponses :


19
votes

dans Java Les membres privés de classes intérieurs / imbriqués sont accessibles à la classe contenant. En C #, ils ne sont pas.


4 commentaires

Le compilateur permet à cela en générant des accesseurs synthétiques avec des autorisations appropriées. Désolé de faire revivre un vieux fil ...


@Jonathan: Oui, c'est vrai. Cela concerne le fait que la JVM ne connaisse pas vraiment les classes imbriquées, et donc les méthodes de synthèse sont nécessaires pour obtenir le comportement souhaité. Mon impression était que la question portait sur la langue java, pas la JVM.


Exactement. J'essayais simplement de fournir plus d'informations, au cas où quelqu'un a trébuché à travers cela à l'avenir.


@Jonathan je suis de l'avenir! Merci!



3
votes

Je ne vois pas pourquoi cela devrait être autorisé à compiler. Vous essayez d'accéder aux champs privés d'une classe de l'extérieur de cette classe. Java contient toutefois une règle spéciale pour les classes imbriquées qui permettent l'accès de la classe extérieure.


0 commentaires

3
votes

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

  • public: l'accès n'est pas restreint.
  • protégé: l'accès est limité à la classe contenant ou à des types dérivés de la classe contenant.
  • interne: l'accès est limité à l'assemblage actuel.
  • protégé interne: l'accès est limité à l'assemblage ou à des types actuels dérivés de la classe contenant.
  • privé : l'accès est limité au type contenant.

    Il n'y a pas de cas particulier en C # pour les classes imbriquées, par conséquent, vous ne pouvez pas accéder à un membre privé de l'extérieur de cette classe ou de toute classe dérivant de cette classe.

    Vous pouvez trouver plus d'informations dans l'article Suivre MSDN: Niveaux d'accessibilité (C #)


1 commentaires

Ma compréhension est une sorte de cas particulier pour les classes nichées C #. Ils peuvent accéder aux privés de types joints.



0
votes

Gilad Bracha Sugges qui permettant Les classes extérieures L'accès aux privés de classes imbriquées rompt «la règle de la subvention des systèmes de type pour les langages OO».


0 commentaires