2009-07-03 6 views
11

consideri una copia letterale di builder di Bloch (con le modifiche apportate per la sintassi C# 's):Perché non Builder lo schema di lavoro di Bloch in 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; 
    } 
} 

Se si tenta di eseguire questo, il compilatore C# si lamentano del fatto che non ha il permesso di accedere alle proprietà private di Builder. Tuttavia, in Java, puoi farlo. Quale regola è diversa in C# che ti impedisce di accedere alle proprietà private delle classi nidificate?

(Mi rendo conto che le persone hanno dato delle alternative here ed è grandioso. Quello che mi interessa è il motivo per cui non è possibile utilizzare il modello Java senza modifiche).

+0

Ciao, ho fatto questa domanda esatta. Ho delle risposte abbastanza buone. Qui andiamo [http://stackoverflow.com/questions/512651/how-is-javas-notion-of-static-different-from-cs](http://stackoverflow.com/questions/512651/how-is -javas-noion-of-static-different-from-cs) – uriDium

risposta

18

In Java i membri privati ​​di classi interne/nidificate sono accessibili alla classe contenente. In C# non lo sono.

+1

Il compilatore abilita questo generando accessors sintetici con permessi appropriati. Mi dispiace far rivivere un vecchio thread ... – Jonathan

+0

@ Jonathan: Sì, è vero. Questo ha a che fare con il fatto che la JVM non conosce veramente le classi annidate, e quindi i metodi sintetici sono necessari per ottenere il comportamento desiderato. La mia impressione era che la domanda riguardasse il linguaggio Java, non la JVM. –

+1

Esattamente. Stavo solo cercando di fornire ulteriori informazioni, nel caso in cui qualcuno si sia imbattuto in questo in futuro. – Jonathan

3

Non vedo perché questo dovrebbe essere consentito di compilare. Stai provando ad accedere ai campi privati ​​di una classe al di fuori di quella classe. Java, tuttavia, contiene una regola speciale per classi nidificate che consente l'accesso dalla classe esterna.

2

I livelli di accessibilità in C# sono i seguenti:

  • pubblico: L'accesso non è limitato.
  • protetto: l'accesso è limitato alla classe o ai tipi contenenti derivati ​​dalla classe contenente.
  • interno: l'accesso è limitato all'assembly corrente.
  • protetto interno: l'accesso è limitato all'assembly corrente o ai tipi derivati ​​dalla classe contenente.
  • privato: l'accesso è limitato al tipo di contenuto.

Non v'è alcun caso particolare in C# per le classi nidificate, di conseguenza non è possibile accedere a un membro privato da esterno che classe o qualsiasi classe che deriva da quella classe.

È possibile trovare maggiori informazioni in questo articolo di MSDN seguire: "la regola sussunzione dei sistemi di tipo per linguaggi OO" Accessibility Levels (C#)

+0

La mia comprensione è che esiste un tipo di caso speciale per le classi nidificate in C#. Possono accedere ai privati ​​di tipi che racchiudono. –

0

Gilad Bracha argues che permettere classi esterni l'accesso ai privati ​​di classi nidificate pause

Problemi correlati