2009-07-03 6 views
11

Rozważmy dosłowne kopię Blocha budowniczy (ze zmianami wprowadzonymi do składni C# 's):Dlaczego nie Builder praca Wzór Blocha w 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; 
    } 
} 

Jeśli próbujesz uruchomić to, kompilator C# będzie narzekać, że nie ma uprawnień dostępu do prywatnych właściwości Buildera. Jednak w Javie możesz to zrobić. Jaka zasada różni się w C#, która uniemożliwia dostęp do prywatnych właściwości zagnieżdżonych klas?

(Zdaję sobie sprawę, że ludzie podali alternatywę here i to świetnie, ale to, co mnie interesuje, to dlaczego nie można używać wzorca Java bez modyfikacji).

+0

Witam Zadaję to dokładne pytanie. Odbieram całkiem dobre odpowiedzi. Tutaj idziemy [http://stackoverflow.com/questions/512651/how-is-javas-notion-of-static-different-crom-cs](http://stackoverflow.com/questions/512651/how-is -javas-pojęcie-statyczne-różne-od-cs) – uriDium

Odpowiedz

18

W języku Java prywatne elementy klas wewnętrznych/zagnieżdżonych są dostępne dla klasy zawierającej. W języku C# nie są.

+1

Kompilator włącza to przez generowanie syntetycznych akcesorów z odpowiednimi uprawnieniami. Przepraszam, że ożywam stary wątek ... – Jonathan

+0

@ Jonathan: Tak, to prawda. Ma to związek z faktem, że JVM tak naprawdę nie wie o klasach zagnieżdżonych, a więc metody syntetyczne są niezbędne do uzyskania pożądanego zachowania. Mam wrażenie, że pytanie dotyczyło języka Java, a nie JVM. –

+1

Dokładnie. Próbowałem tylko dostarczyć więcej informacji, na wypadek gdyby ktoś natknął się na to w przyszłości. – Jonathan

3

Nie widzę powodu, dla którego powinno to pozwolić na kompilację. Próbujesz uzyskać dostęp do prywatnych pól klasy spoza tej klasy. Java jednak zawiera specjalną regułę dla zagnieżdżonych klas, która pozwala na dostęp z zewnętrznej klasy.

2

poziomy dostępności w C# są następujące:

  • publicznego: dostęp nie jest ograniczony.
  • chronione: Dostęp jest ograniczony do klasy lub typów zawierających klasy pochodne.
  • wewnętrzny: Dostęp jest ograniczony do bieżącego zespołu.
  • Zabezpieczony wewnętrzny: Dostęp jest ograniczony do bieżącego zestawu lub typów pochodnych od klasy zawierającej.
  • prywatny: Dostęp jest ograniczony do typu zawierającego.

Nie ma specjalnego przypadku w języku C# dla klas zagnieżdżonych, w wyniku czego nie można uzyskać dostępu do prywatnego elementu spoza tej klasy lub dowolnej klasy pochodzącej z tej klasy.

można znaleźć więcej informacji w następstwie MSDN artykułu: „reguły subsumcji systemów typu dla języków oo” Accessibility Levels (C#)

+0

Jak rozumiem, istnieje specjalny przypadek dla klas zagnieżdżonych w C#. Mogą uzyskać dostęp do szeregów obejmujących typy. –

0

Gilad Bracha argues że pozwalając klas zewnętrzne dostęp do szeregowców zagnieżdżonych klas przerw