![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
StepS |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 26.8.2005 Где: Днепропетровск Репутация: нет Всего: нет |
Вем привет.
До недавнего времени я был уверен в следующем:
так вот... я был уверен, что если написать так:
на экране появиться строка: "Class A", т.к. в классе B мы не используем ключевое слово new в объявлении метода, который скрывает метод из базового класса, а если мы напишем new public void M1(){....} в классе В, то на экране появится строка "Class B". Но... как оказалось.. это не так теперь я понимаю, что ключевое слово new чисто для удобства чтения кода. или КАК ? в книге написано: "Без использования ключевого слова new вы рискуете вызвать не тот метод". КАК НА ПРИМЕРЕ ВЫЗВАТЬ НЕ ТОТ МЕТОД ??? ![]() |
||||
|
|||||
SpaceSpace |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 10.4.2007 Где: Самара Репутация: 2 Всего: 10 |
Советую все-таки перечитать книгу.
и трех китов: инкапсуляция, полиморфизм, наследование повторить есть такое дело ключевое слово NEW - вызывает конструктор класса, но базовый то у тебя А!! а, если напишеш , а потом приведешь
то вызовется нужный метод В! там все дело в том, что ты создаеш класс А, с его стеком процедур, а конструктор чужой а вот если напишешь
то без всякого приведения будет В!, т.к. метод базового виртуальный и в последствии переопределен если в В напишешь
то всегда будет метод В! -------------------- Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение. 70-565 MCPD Enterprise 3.5 |
||||||
|
|||||||
StepS |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 26.8.2005 Где: Днепропетровск Репутация: нет Всего: нет |
Спасибо, это я все знаю
![]() У меня был вопрос про ключевое слово new в объявлении метода. Как создаются классы я в курсе. Меня интересует имменно ключевое слово new именно в контексте приминения в объявлении метода. С override-ми я тоже знаком и знаю как они работют ![]() Вопрос про скрытие методов наследуемыми классами. |
|||
|
||||
archeg |
|
||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Модификатор new только для удобства чтения кода. С MSDN:
new в C# используется в 3-х случаях: 1) Operator
2) Modifier
3) Constraint
Это сообщение отредактировал(а) archeg - 1.6.2007, 12:05 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет ![]() И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
||||||||||||||
|
|||||||||||||||
adLucem |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 17.4.2007 Где: Украина, Донецк Репутация: 4 Всего: 5 |
new (не полиморфное поведение) в объявлении метода, который скрывает метод базового класса используется только для синтаксического подтверждения понимания того что вы делаете и дополняет слово override (полиморфное поведение).
|
|||
|
||||
StepS |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 26.8.2005 Где: Днепропетровск Репутация: нет Всего: нет |
Ок. Я понял, тогда объясните что имелось ввиду под : "может быть вызван не правильный метод" без использования new. Это, кстати из книги, которая обсуждалась на этом форуме: "C# 2005 для проффесионалов".
|
|||
|
||||
adLucem |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 17.4.2007 Где: Украина, Донецк Репутация: 4 Всего: 5 |
Если бы new не требовалось то:
|
||||
|
|||||
StepS |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 26.8.2005 Где: Днепропетровск Репутация: нет Всего: нет |
ну и что... теперь ставим ключевое слово:
не пойму, что твой пример показыват ?? кроме как вызов методов идет из типа объекта, а не объекта-типа. Добавлено через 1 минуту т.е. как написал archeg это для удобвства использования ? |
||||
|
|||||
ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Причем сдесь удобство использования? Это ключевое слово очень важно.
Оно показывает, что этот метод никоем боком не соотносится с методом с тем же именем базового класса, и, при вызове этого метода у экземпляра наследника используя ссылку, которая имеет базовый тип (полиморфизм), нужно использовать реализацию базового класса. В реализации .Net, если ты определил в наследнике метод с той же самой сигнатурой, что и в базовом но без модификаторов new или override, это равнозначно наличию модификатора new + выводится предупреждение на всякий случай. В Java, например, все наоборот. Отсутствие модификатора говорит о том, что новый метод переопределяет (override) метод родителя. Т.е. если ты пришел в .net из Java, то что и сказал B]adLucem[/B]. |
|||
|
||||
StepS |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 26.8.2005 Где: Днепропетровск Репутация: нет Всего: нет |
ivashkanet можешь привести пример, который без new вызывает из ротительского класса метод (при ссылке на родителя), а с присутствием new вызывает метод из дочернего класса (опять же при ссылке на родителя).
Я проверил на примере - см мой первый пост. Всегда вызывается метод по ссылке на класс. т.е.
будет всегда отрабатывать метод M1 из класса А, используешь ты new в определении метода (дочернего типа В) или нет !!!!
можешь объяснить с примерами как оно важно или дать ссылку где это описано плз? |
||||
|
|||||
stab |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
логично, метод-то не виртуальный, поэтому и биндится во время компиляции исходя из типа объекта к которому применяется, а точнее сказать типа ссылки. в данном контексте ключевое слово new решает такую проблему:
на второй строчке компилятор задаётся вопросом: какой из методов Foo вызывать. их два: один достался от базового класса, второй объявлен в дочернем. ключевое слово new на методе в дочернем классе как раз таки и говорит компилятору, что ты сознательно объявил метод с таким же именем и набором параметров, и хочешь использовать именно его для ссылок на Derived. -------------------- 6, 6, 6 - the number of the beast. |
||||
|
|||||
adLucem |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 17.4.2007 Где: Украина, Донецк Репутация: 4 Всего: 5 |
Без new вы даже код не сможете скомпилировать - это синтаксис языка. Почему применен именно такой синтаксис - явное подтверждение понимания действия всегда более приоритетно чем поведение по умолчанию (за более авторитетным мнением).
Что вам еще - MSDN пересказать?
Пример из MSDN:
Это сообщение отредактировал(а) adLucem - 1.6.2007, 16:20 |
||||||||
|
|||||||||
ivashkanet |
|
||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Нет, конечно, это бред.
Какие примеры? Что ты хочешь понять?
ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ............................................................................................................................................................................................................................................ ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, ДА, Так оно и будет. Но дело не в этом. new означает: "Я, Иванов Иван Иванович, полностью сознаю, что этот метод с такой сигнатурой используется так же в базовом классе, так же я заявляю, что определенный мною метод никоем образом не согласуется с методом базового класса , поэтому при полиморфизме прошу использовать метод базового класса." |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |