2016-01-13 2 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.Nested и SubOuter.Nested эквивалентным?

Разъяснение: Конечно, он компилирует потому, что C# спецификация говорит так. Я это понимаю. Я спрашиваю почему C# был спроектирован таким образом, так как он, кажется, не добавить что-то на язык. Если у вас есть пример обратного, то есть некоторый код, который становится проще/короче/лучше, используя эту функцию, пожалуйста, поделитесь ею в ответ, и я с удовольствием приму это.

+2

потому что 'Nested' является общедоступным, поэтому класс SubOuter может видеть его в базовом классе. –

+2

Где проблема, почему вы не хотите, чтобы это было скомпилировано. –

+1

'Outer.Nested' и' SubOuter.Nested' эквивалентны, в них нет различий, кроме способа объявления. –

ответ

5

С точки зрения TestNested - это всего лишь идентификатор, как если бы он был членом, например. Как это public Вы можете получить к нему доступ повсюду, где вы можете получить доступ к любому из классов Outer или SubOuter. Однако оба варианта идентичны, они идентифицируют один и тот же класс.

Вы можете даже ссылаться на один за другим:

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

Или даже

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

Однако, как вы можете увидеть в отладчике как x и y доля ссылка на Outer.Nested вместо SubOuter.Nested ,

EDIT: Как уже упоминалось, это нет новой функции, это просто обычное обращение с членами внутри классов. Таким образом, он, безусловно, не добавляет никакой пользы для языка, поскольку функция, которую вы описываете, просто не существует. Для этого следует Principle of least astonishment.

Лечение вложенных классов различно, однако это будет новая функция.

3

Потому что класс Nestedобщественный, поэтому класс SubOuter может видеть его в базовом классе.

И вы правы. Outer.Nested и SubOuter.Nested эквивалентны, нет никакой разницы в них, кроме способа объявления.

Update

в соответствии с Вашим комментарием, что особенности есть затраты. эта функция уже реализована в .NET (я имею в виду, что подкласс может видеть общедоступные и защищенные члены базового класса) , поэтому для реализации этого нет никаких дополнительных затрат.

вы можете рассматривать класс Nested как любое другое свойство в базовом классе.

Это очень важно объяснить, что написано в комментариях к вашему вопросу на @Damien_The_Unbeliever.

Нет, вы просите новую функцию. Все публичные члены базового класса доступны через наследование классов. Почему классы должны обрабатываться иначе, чем, например, методы и почему команда компилятора должна специально добавить код, чтобы вы не могли делать такие обращения? (И затем получите сообщение об ошибке, переведенное на различные языки, задокументируйте его и т. Д.)

Смежные вопросы