2016-02-15 2 views
0

Как видно из Hejlsberg, et. и др. 2011 4-е изд. Языки программирования C#, которые вы можете сделать «новой» функцией с тем же именем, что и существующий член класса. Я могу несколько понять, почему это может быть полезно в каком-то сценарии конфликтов версий,Частный * новый * метод или «Тень», но частный

Но я не понимаю, почему вы когда-либо хотели бы создать «новую» функцию или функцию «тень»; private

+0

По этой же причине вы хотите, чтобы любой другой член был закрыт? Представьте себе случай, когда новая версия базового класса вводит новый общедоступный виртуальный метод с тем же именем, что и существующий частный метод, который у вас есть в вашем подклассе. Минимальное изменение, чтобы ваш код скомпилировать и работать точно так же, как и раньше, без каких-либо предупреждений, заключается в том, чтобы явно помечать его как «новый», чтобы показать, что он не пытается переопределить метод базового класса. –

+0

@JonSkeet Я думаю, что моя реакция на коленный рефлекс здесь, почему бы просто не назвать ее другим именем? –

+0

@JonSkeet Можно сказать, что тени - это исключительно домен кода, который по какой-то неисчислимой причине не может быть реорганизован? Я лично не вижу возможности использовать эту функцию при работе в одиночной иерархии классов, и это запутывает меня, когда я пытаюсь установить правильный набор инструментов из доступных идиом. Другой, который беспокоит меня, например, - это перестройка интерфейса. Мне кажется; они не нужны, если у вас есть исходный код; ты меня поймаешь? –

ответ

-1

Существует несколько различий между ними. 1. Тень - плохая практика программирования в соответствии с концепциями ООП. 2. В теневой подписи могут быть разные. 3. В теневом методе доступны методы Derived класса и методы базового класса.

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

+0

Зачем вам делать * новую * функцию частной? Потребители должны уметь видеть ваши * новые *, если они захотят, и они находятся на версии II и знают об этом и тому подобное. Почему ты когда-нибудь делал это частным? –

+0

личное ключевое слово, используемое для ограничения функции, поэтому оно доступно только для тех, кто работает над ним, и что вы подразумеваете под ПОТРЕБИТЕЛЕМ? – Badsector

+0

Итак, если вы работаете над этим, почему бы вам просто не дать исходной функции новое, более описательное и конкретное имя для того, что он делает? Почему бы создать вторую, теневую функцию/метод, чтобы разрешить конфликт имен, когда ТОЛЬКО вы можете увидеть новую тень? Ни один другой пользователь или пользователь вашего класса не может видеть или использовать новую тень, поэтому зачем вам нужно использовать обычную функцию старого имени функции или метода, используя тень * new * shadow, * new * * _private_ * ? –

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