2011-08-22 68 views
1

在過去,我避免了定義嵌套類。但是,如果一個班級只會在小學階段內使用,那麼是否將班級嵌入班級是理想的地方?在這個問題上是否有公認的公約?C# - 定義公共嵌套類:我們應該這樣做嗎?

public class PrimaryClass 
{ 
    public class SubClass 
    { 
     // ... 
    } 

    public SubClass MySubClass { get; set; } 
    // ... 
} 

或者它應該永遠是

public class SubClass 
{ 
    // ... 
} 

public class PrimaryClass 
{ 
    public SubClass MySubClass { get; set; } 
    // ... 
} 

回答

1

您是如果子類在主類只使用過的正是正確─,它是分離的關注很好的做法。在Java中,這是一種稱爲匿名內部類的語言級結構。如果需要,您可以在以後重新構造子類。

這篇比較C#和Java的wiki文章有很好的分析,涵蓋了一般指導方針和語言特定問題。 http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java#Inner_and_local_classes

+0

如果它們在本例中被命名,則它們不是匿名的,而只是「內部」類。匿名類是不包含「類名」聲明的類。此外,如果標記爲公開,則該課程也可以從周圍的課程外部訪問。 –

+0

@ filip-fku正確。正如我所提到的,在Java中,匿名內部類是*類似結構。有幾個重要的細微差別,特別是在訪問靜態變量方面。 –

+0

但是在Java中,與「匿名內部」類相比,它更接近於匹配的內容 - 僅僅是一個命名的內部/嵌套類。如果在與Java概念比較中引用「內部類」而不是「匿名內部類」,我認爲它會更有幫助。 Java中的匿名類既可以作爲類聲明,也可以作爲實例化,但在此情況並非如此。 –

0

如果內部類是其父外部類的一個內在組成部分,那麼它是完全正常的這樣做。我看到一個內部類就像外部類的任何其他成員一樣,除了它有自己的一套方法和屬性。

例如,發動機是機動車輛的固有部分。它不能在一個之外運作(因此毫無意義),換句話說,它的存在意義僅取決於機動車輛。我當然在這裏假設一個引擎不能存在於除了汽車之外的其他任何東西(不能想象一個更好的例子,對不起)。

在C#中,您當然也可以將引擎作爲單獨的類來實現,並從機動車輛類中引用它。這真是您的選擇。

0

除了僅在外部類中使用嵌套類外,還有一些情況下需要將其實例交給外部世界。通常你使用inerfaces來做到這一點。下面是如何使用嵌套類的實例和接口:

public interface IDoSomething {...} 

    public class Outer 
    { 

     public static IDoSomething GetSomethingToDo(... parameters ...) 
     { 
      if (...) return new SomethingA(); 
      else return new SomethingB(); 
     } 

     private class SomethingA : IDoSomething { ...} 
     private class SomethingB : IDoSomething { ...} 

    } 

DoSomething實現完全從外部世界隱藏。

0

我傾向於將嵌套類只定義爲私有的,從不公開。以這種方式,嵌套類將僅被封閉類使用。只有當嵌套類被多個頂級類使用時,纔會將該類移動到頂層。然後我通常會把它放在內部。

使用公共嵌套類應保留用於枚舉。

相關問題