2016-01-13 96 views
5

考慮下面的代碼例如:爲什麼嵌套類「繼承」?

class Outer 
{ 
    public class Nested { } 
} 

class SubOuter : Outer { } 

class Test 
{ 
    Test() 
    { 
     Outer.Nested x;  // Makes sense. 
     SubOuter.Nested y; // Compiles, but why? 
    } 
} 

看來,嵌套類被「繼承」由子類。這點在哪裏?我能用這個功能做什麼,我不能(或不能輕易)做到這一點?是不是Outer.NestedSubOuter.Nested完全相同?

澄清:當然它編譯,因爲C#規範說。我明白那個。我問的是爲什麼 C#是這樣設計的,因爲它似乎沒有加上這個語言。如果您有相反的例子,即使用此功能可以使某些代碼更容易/更短/更好,請將其分享給我們,我會很樂意接受它。

+2

因爲'Nested'是公共的,所以'SubOuter'類可以在基類中看到它。 –

+2

問題在哪裏,爲什麼你不想編譯它。 –

+1

'Outer.Nested'和'SubOuter.Nested'是等價的,除了聲明方式外,它們沒有區別。 –

回答

5

Test的角度來看Nested只是一個標識符,就好像它是一個成員例如因爲它是public您可以在無法訪問任何類OuterSubOuter的地方訪問它。然而,兩種用法都是相同的,他們確定了同一個班級。

你甚至可以參考一個由其它:

Outer.Nested x = new Outer.Nested(); 
SubOuter.Nested y = x; 

甚至

Outer.Nested x = new SubOuter.Nested(); 
SubOuter.Nested y = x; 

但是,你可以在調試器中看到這兩個xy份額參考Outer.Nested而不是SubOuter.Nested

編輯:正如其他已經提到這是沒有新的功能,它只是對類內成員的通常處理。因此它肯定不會爲語言添加任何好處,因爲您描述的功能根本不存在。這是爲了遵循Principle of least astonishment

但是,處理嵌套類不同然而會是一個新功能。

3

因爲Nested類是public,所以SubOuter類可以在基類中看到它。

而且你是對的。 Outer.NestedSubOuter.Nested是等價的,除了聲明方式外,它們沒有區別。

更新

根據您的評論,這些特徵具有成本

。這個特性已經在.NET中實現了(我的意思是子類可以看到基類的公共和受保護成員),因此不需要額外的成本來實現這個.NET。

您可以像基類中的任何其他屬性一樣考慮嵌套類。

這是非常重要的解釋,寫在您的問題的評論由 @Damien_The_Unbeliever。

不,您正在尋求新功能。基類的所有公共成員都可以通過繼承類來訪問。爲什麼班級的待遇不同於方法,爲什麼編譯器團隊必須專門添加代碼以防止您進行此類訪問? (然後將錯誤信息翻譯成各種語言,記錄它等)