2017-05-25 50 views
-1

我在今天的工作中查看代碼庫中的其他內容時,發現了下面的代碼,我甚至無法弄清楚這種事情是如何工作的。有人可以向我解釋這可能嗎?嵌套類如何從容器類繼承?

class Outer { 
    void MethodOne(); // Non-virtual 
    // more non-virtual methods 
    public class InnerFoo : Outer { // HOW is this possible? 
     void InnerMethodOne(); 
     // more methods on the derived class 
    } 
    public class InnerBar : Outer { // o_O 
     // stuff 
    } 
} 

我不知道編譯器如何解析這個,更不用說解釋這樣的類結構。

+0

即使這是可能的,它可能不是最佳實踐,也沒有多大意義。 –

+2

不知道如何回答你的問題,而不是..爲什麼不可能? – Rob

回答

1

從編譯器的角度來看,這很簡單。編譯器爲從Outer繼承的兩個類輸出MSIL。任何試圖在名稱空間Outer之外引用InnerBarInnerFoo的代碼都將導致編譯錯誤。

在輸出字節代碼而言,這個代碼是相同的以下

class Outer { 
    void MethodOne(); 
    // more non-virtual methods 
} 

class InnerFoo : Outer { 
    void InnerMethodOne(); 
    // more methods on the derived class 
} 

class InnerBar : Outer { 
    // stuff 
} 

相關點要記住的是編譯器,一類是隻是否嵌套的或不是類。嵌套類和普通類之間的唯一區別是編譯器如何允許其他類引用它。

+0

啊,謝謝。我從不使用嵌套類(從未看到過真正的原因),所以沒有意識到編譯器如何處理它們。 –

+0

他們非常值得你的時間 - 它們可以非常有用地保留封裝,或者當你需要避免用各種實用程序類來污染API命名空間時。 – s3raph86