Доступ к закрытым свойствам родителя через вложенные типы в C # - PullRequest
5 голосов
/ 01 июля 2011

Вложенные типы в C # имеют возможность доступа к закрытым свойствам родителя. Есть ли конкретная причина наличия этой языковой функции? На мой взгляд, это нарушает инкапсуляцию. Если я сделаю вложенный тип общедоступным, то через него я смогу раскрыть частные свойства родительского класса.

Ответы [ 3 ]

6 голосов
/ 01 июля 2011

Вы могли бы быть в состоянии - но вы можете вложить класс только в том случае, если он изначально находится в том же исходном файле, что и внешний класс.Вложенный класс «принадлежит» внешнему классу и ему доверяют так же, как и любому другому члену внешнего класса.Метод во внешнем классе также может предоставлять приватное свойство, но вы не доверяете ему, потому что вы владеете всем этим кодом.Точно так же вы (автор внешнего класса) владеете всем кодом вложенного класса.Если вы не хотите нарушать инкапсуляцию во вложенном классе, просто избегайте написания кода, который нарушил бы инкапсуляцию:)

5 голосов
/ 01 июля 2011

Вложенный класс является частью включающего класса, как и метод. Предоставление через них закрытых свойств не нарушает инкапсуляцию, равно как и предоставление закрытых свойств через методы.

Модель, которую C # использует для контроля доступа, заключается в том, что вы можете получить доступ ко всему, что вам захочется в пределах определяемого вами класса , и трудно понять, как это может работать любым другим способом.

2 голосов
/ 01 июля 2011

(IMO) Вложенный тип является частью вложенного типа, и поэтому он должен иметь доступ к private членам - как и любая другая часть этого типа.

Точно так же, как если бы вы делали любую другую часть типа public, это тоже могло бы предоставить частные свойства типа.

Поскольку вложенный тип может писать только тот, кто написал вложенный тип, реального риска нет?

...