![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| 666TEHb666 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.10.2008 Где: Новокузнецк Репутация: нет Всего: нет |
Здравствйте.
Недавно задавал вопрос по интерфейсу. Мне помогли и вопрос был решен. Но по ходу написания других классов библиотеки появился еще один вопрос. В принципе, все работает, но я не могу понять как. Очевидно теорию я слабо копал или просто запутался. Вообщем поясните ситуацию, если не затруднит. Суть вот в чем: Есть интерфейс
Его наследует абстрактный класс
Этот класс дает реализацию сигнатуры интерфейса Draw(). Далее, другой класс наследует абстрактный Control и переопределяет метод Draw().
Работать то все это работает. Вызывается нужный переопределенный метод.. Но не совсем пойму почему не надо писать override и virtual. Ну virtual наверное потому что в абстрактном классе и так методы виртуальные..но override тогда почему? Или здесь подразумевается просто новая реализация метода? Просто запутался немного,буду признателен, если поясните. Заранее благодарю. |
||||||
|
|||||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
переопределение это новая реализация метода с уже заданной сигнатурой, т.е. ты заменяешь старое тело метода на новое, а ты просто добавил перегрузку метода Draw.
Добавлено через 1 минуту и 39 секунд к примеру если ты укажешь в абстрактном классе что метод Draw абстрактный то компилятор скажет что твой класс-наследник не реализовал абстрактный метод из класса Control. |
|||
|
||||
| neutrino |
|
||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Обрати внимание на сигнатуру (имя, параметры и возвращаемый тип), она отлична от предысущих. Как правильно сказал Эксплуататор, это просто перегрузка метода. Если бы ты в последнем классе указал метод с той же сигнатурой, компилятор бы ругался и решение было бы объявить в абстрактном классе этот метод виртуальным. -------------------- The truth comes from within ... Покойся с миром, Vit |
||||
|
|||||
| 666TEHb666 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.10.2008 Где: Новокузнецк Репутация: нет Всего: нет |
Экскалупатор, neutrino, спасибо за ответы.
Теперь понял. Вот только,чтобы вы посоветовали: оставить как есть перегруженный метод и следить чтобы вызывался именно он или переопределить тот,оставив просто неиспользуемые параметры( чтобы не было возможности вызвать некорректный метод,так как он вроде сохранится тоже,если я правильно понял..)..
Да я знаю =) Просто потом уже увидел после того как создал тему,компилятор вежливо напомнил =) Я исправил, расширив сигнатуру интерфейса. |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
тут все зависит от предполагаемого использования. переопределение не заменяет перегрузки.
к примеру если у тебя есть класс "фигура"(Shape), с абстрактным методом "рисовать"(Draw). ты делаешь наследников от "фигура" - "круг", "квадрат", "ромб", каждый из которых по своему реализует метод "рисовать". так вот ты можешь создать массив классов "фигура", потом заполнить его разными наследниками класса фигура(кругами, квадратами и пр.), то ты сможешь обходить массив фигур вызывая по индексу для каждого элемента метод Draw, и у тебя каждый раз будет вызываться нужная перегрузка метода.(т.е. если пятый элемент круг то вызовется метод для круга, если квадрат то для квадрата). с перегрузкой этого сделать не получится. так что отталкивайся от своей архитектуры. |
|||
|
||||
| neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Будет вызываться нужная реализация. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
| Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
neutrino, точно. что то я в последнее время слова забываю. к чему бы это по хаусу? к волчанке? или все же печень отказывает? надо сделать полный диализ... |
|||
|
||||
| 666TEHb666 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 5.10.2008 Где: Новокузнецк Репутация: нет Всего: нет |
neutrino, Экскалупатор
Еще раз благодарю за ответы и участие =) Учту свою архитектуру и, думаю, оставлю перегрузку, а в первичной реализации выброшу исключение. Вопрос решен. Это сообщение отредактировал(а) 666TEHb666 - 24.11.2010, 18:14 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |