Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > new keyword в объявление методов |
Автор: StepS 1.6.2007, 10:56 | ||||
Вем привет. До недавнего времени я был уверен в следующем:
так вот... я был уверен, что если написать так:
на экране появиться строка: "Class A", т.к. в классе B мы не используем ключевое слово new в объявлении метода, который скрывает метод из базового класса, а если мы напишем new public void M1(){....} в классе В, то на экране появится строка "Class B". Но... как оказалось.. это не так теперь я понимаю, что ключевое слово new чисто для удобства чтения кода. или КАК ? в книге написано: "Без использования ключевого слова new вы рискуете вызвать не тот метод". КАК НА ПРИМЕРЕ ВЫЗВАТЬ НЕ ТОТ МЕТОД ??? ![]() |
Автор: SpaceSpace 1.6.2007, 11:50 | ||||||
Советую все-таки перечитать книгу. и трех китов: инкапсуляция, полиморфизм, наследование повторить есть такое дело ключевое слово NEW - вызывает конструктор класса, но базовый то у тебя А!! а, если напишеш , а потом приведешь
то вызовется нужный метод В! там все дело в том, что ты создаеш класс А, с его стеком процедур, а конструктор чужой а вот если напишешь
то без всякого приведения будет В!, т.к. метод базового виртуальный и в последствии переопределен если в В напишешь
то всегда будет метод В! |
Автор: StepS 1.6.2007, 11:56 |
Спасибо, это я все знаю ![]() У меня был вопрос про ключевое слово new в объявлении метода. Как создаются классы я в курсе. Меня интересует имменно ключевое слово new именно в контексте приминения в объявлении метода. С override-ми я тоже знаком и знаю как они работют ![]() Вопрос про скрытие методов наследуемыми классами. |
Автор: archeg 1.6.2007, 12:01 | ||||||||||||||
Модификатор new только для удобства чтения кода. С MSDN:
new в C# используется в 3-х случаях: 1) Operator
2) Modifier
3) Constraint
|
Автор: adLucem 1.6.2007, 12:01 |
new (не полиморфное поведение) в объявлении метода, который скрывает метод базового класса используется только для синтаксического подтверждения понимания того что вы делаете и дополняет слово override (полиморфное поведение). |
Автор: StepS 1.6.2007, 12:56 |
Ок. Я понял, тогда объясните что имелось ввиду под : "может быть вызван не правильный метод" без использования new. Это, кстати из книги, которая обсуждалась на этом форуме: "C# 2005 для проффесионалов". |
Автор: adLucem 1.6.2007, 13:02 | ||||
Если бы new не требовалось то:
|
Автор: StepS 1.6.2007, 14:19 | ||||
ну и что... теперь ставим ключевое слово:
не пойму, что твой пример показыват ?? кроме как вызов методов идет из типа объекта, а не объекта-типа. Добавлено через 1 минуту т.е. как написал archeg это для удобвства использования ? |
Автор: ivashkanet 1.6.2007, 15:04 |
Причем сдесь удобство использования? Это ключевое слово очень важно. Оно показывает, что этот метод никоем боком не соотносится с методом с тем же именем базового класса, и, при вызове этого метода у экземпляра наследника используя ссылку, которая имеет базовый тип (полиморфизм), нужно использовать реализацию базового класса. В реализации .Net, если ты определил в наследнике метод с той же самой сигнатурой, что и в базовом но без модификаторов new или override, это равнозначно наличию модификатора new + выводится предупреждение на всякий случай. В Java, например, все наоборот. Отсутствие модификатора говорит о том, что новый метод переопределяет (override) метод родителя. Т.е. если ты пришел в .net из Java, то что и сказал B]adLucem[/B]. |
Автор: StepS 1.6.2007, 15:52 | ||||
ivashkanet можешь привести пример, который без new вызывает из ротительского класса метод (при ссылке на родителя), а с присутствием new вызывает метод из дочернего класса (опять же при ссылке на родителя). Я проверил на примере - см мой первый пост. Всегда вызывается метод по ссылке на класс. т.е.
будет всегда отрабатывать метод M1 из класса А, используешь ты new в определении метода (дочернего типа В) или нет !!!!
можешь объяснить с примерами как оно важно или дать ссылку где это описано плз? |
Автор: adLucem 1.6.2007, 16:19 | ||||||||
Без new вы даже код не сможете скомпилировать - это синтаксис языка. Почему применен именно такой синтаксис - явное подтверждение понимания действия всегда более приоритетно чем поведение по умолчанию (за более авторитетным мнением).
Что вам еще - MSDN пересказать?
Пример из MSDN:
|
Автор: ivashkanet 1.6.2007, 16:21 | ||||||
Нет, конечно, это бред.
Какие примеры? Что ты хочешь понять?
ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ............................................................................................................................................................................................................................................ ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, Так оно и будет. Но дело не в этом. new означает: "Я, Иванов Иван Иванович, полностью сознаю, что этот метод с такой сигнатурой используется так же в базовом классе, так же я заявляю, что определенный мною метод никоем образом не согласуется с методом базового класса , поэтому при полиморфизме прошу использовать метод базового класса." |