2010-08-11 83 views
5

誰能解釋一下,爲什麼我們可以做這樣的事情,我們爲什麼需要這個公衆內部類

public class OuterClass 
{ 
    public class InnerClass 
    { 
    } 
} 

我們爲什麼需要公衆在內的任何:結構,類,枚舉或靜態類?

我認爲,如果它是內在的,那麼它必須是隻有私人或受保護的。

+0

爲什麼你認爲「如果它是內在比它必須是唯一的私人或受保護的「? – Jesper 2010-08-11 14:26:33

+0

我的意思是對我來說是合乎邏輯的,但正如人們所說有時我們需要這樣的功能 – anderhil 2010-08-11 14:38:37

回答

12

您一般不需要公共嵌套類型 - 但它們有時可能會有用。他們很清楚地表明一種類型與另一種明確相關。

他們允許嵌套類型訪問封閉類型(在C#中)的私有成員,這有時可能會有用。例如,我會猜測List<T>.Enumerator可能會這樣做。在Java中,訪問規則反過來工作 - 封閉類可以訪問嵌套類的私有成員。

我認爲必須解釋爲什麼你想明確禁止而不是它爲什麼需要,因此。我想不出任何其他地方你可以指定訪問修飾符,但不能讓使它公開,除了不一致之外(例如用內部返回類型聲明一個公共方法)。

+0

你搖滾,喬恩!真的,真棒解釋 – 2010-08-11 14:18:14

+0

謝謝你的回答,現在很清楚。我問這個問題的原因,是因爲我看到了我們的初級開發人員如何嵌套enum,並將它用作類的方法的參數。所以對我來說這很奇怪,因爲我以前從未見過這樣的代碼。 OuterClass obj = new OuterClass(); obj.Method(OuterClass.InnerEnum.Value1); – anderhil 2010-08-11 14:50:37

+1

「看起來奇怪」不是被拒絕的原因;-) – 2010-08-11 15:05:06

2

考慮這個例子:

public class TrainingFile { 

    public List<TrainingFileEntry> getEntries() { 
      return ... 
    } 

    public class TrainingFileEntry { 
     int x; 
     int y; 
    } 
} 

你想隱藏TrainingFileEntry的細節,但你的客戶需要能夠使用它。 Ofc你可以爲這個嵌套類創建一個自己的文件,但是這樣一個嵌套的幫助類大多不是「獨立的」並且堅持它嵌套的類。 - )

+0

+1 - 我使用類似的東西來檢驗很多WPF控件,它們可能具有內部類作爲視圖部分(列表條目等)....保持實際的命名空間更清潔。 – TomTom 2010-08-11 14:16:49

0

當InnerClass的每個成員確實屬於一個成員,並且只有一個成員外部類時,它非常有用。我已經使用了這個構造,其中OuterClass是數學對象的集合,InnerClass是它們自己的實際對象。一般不推薦