Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактный класс и виртуальный метод, Переопределение метода 
V
    Опции темы
666TEHb666
Дата 22.11.2010, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.10.2008
Где: Новокузнецк

Репутация: нет
Всего: нет



Здравствйте.

Недавно задавал вопрос по интерфейсу. Мне помогли и вопрос был решен. Но по ходу написания других классов библиотеки появился еще один вопрос. В принципе, все работает, но я не могу понять как. Очевидно теорию я слабо копал или просто запутался. Вообщем поясните ситуацию, если не затруднит.
Суть вот в чем:

Есть интерфейс
   
Код

 interface IControl
    {
        //...
        void Draw(SpriteBatch spriteBatch, float imgWidth, float imgHeight);
    }


Его наследует абстрактный класс
Код

abstract public class Control : IControl
    {
        #region свойства
        //...
        #endregion

        #region методы
        public void CreateBackImg(SpriteBatch spriteBatch, float imgWidth, float imgHeight, Vector2 Location)
        {
             //...
        }

        public void Draw(SpriteBatch spriteBatch, float imgWidth, float imgHeight, Vector2 Location)
        {
            CreateBackImg(spriteBatch, imgWidth, imgHeight, Location);
        }
        #endregion
    }


Этот класс дает реализацию сигнатуры интерфейса Draw().

Далее, другой класс наследует абстрактный Control и переопределяет метод Draw().

Код

 public class BasePanel : Control
    {
         //...
         public void Draw(SpriteBatch spriteBatch)
        {
            CreateBackImg(spriteBatch, Constants._BP_backImg_width, Constants._BP_backImg_height, new Vector2(Location.X, Location.Y));
            //...
        }
}


Работать то все это работает. Вызывается нужный переопределенный метод.. Но не совсем пойму почему не надо писать override и virtual. Ну virtual наверное потому что в абстрактном классе и так методы виртуальные..но override тогда почему? Или здесь подразумевается просто новая реализация метода?
Просто запутался немного,буду признателен, если поясните.
Заранее благодарю.
PM MAIL ICQ Skype   Вверх
Экскалупатор
Дата 22.11.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



переопределение это новая реализация метода с уже заданной сигнатурой, т.е. ты заменяешь старое тело метода на новое, а ты просто добавил перегрузку метода Draw.

Добавлено через 1 минуту и 39 секунд
к примеру если ты укажешь в абстрактном классе что метод Draw абстрактный то компилятор скажет что твой класс-наследник не реализовал абстрактный метод из класса Control.
PM MAIL ICQ   Вверх
neutrino
Дата 22.11.2010, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Цитата(666TEHb666 @  21.11.2010,  23:33 Найти цитируемый пост)
 void Draw(SpriteBatch spriteBatch, float imgWidth, float imgHeight);


Цитата(666TEHb666 @  21.11.2010,  23:33 Найти цитируемый пост)
public void Draw(SpriteBatch spriteBatch, float imgWidth, float imgHeight, Vector2 Location)


Обрати внимание на сигнатуру (имя, параметры и возвращаемый тип), она отлична от предысущих. 
Цитата(666TEHb666 @  21.11.2010,  23:33 Найти цитируемый пост)
public void Draw(SpriteBatch spriteBatch)

Как правильно сказал Эксплуататор, это просто перегрузка метода. Если бы ты в последнем классе указал метод с той же сигнатурой, компилятор бы ругался и решение было бы объявить в абстрактном классе этот метод виртуальным.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
666TEHb666
Дата 22.11.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.10.2008
Где: Новокузнецк

Репутация: нет
Всего: нет



Экскалупатор, neutrino, спасибо за ответы.

Теперь понял. Вот только,чтобы вы посоветовали: оставить как есть перегруженный метод и следить чтобы вызывался именно он или переопределить тот,оставив просто неиспользуемые параметры( чтобы не было возможности вызвать некорректный метод,так как он вроде сохранится тоже,если я правильно понял..)..

Цитата

Обрати внимание на сигнатуру (имя, параметры и возвращаемый тип), она отлична от предысущих.


Да я знаю =) Просто потом уже увидел после того как создал тему,компилятор вежливо напомнил =) Я исправил, расширив сигнатуру интерфейса.
PM MAIL ICQ Skype   Вверх
Экскалупатор
Дата 22.11.2010, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



тут все зависит от предполагаемого использования. переопределение не заменяет перегрузки. 
к примеру если у тебя есть класс "фигура"(Shape), с абстрактным методом "рисовать"(Draw). ты делаешь наследников от "фигура" - "круг", "квадрат", "ромб", каждый из которых по своему реализует метод "рисовать". так вот ты можешь создать массив классов "фигура", потом заполнить его разными наследниками класса фигура(кругами, квадратами и пр.), то ты сможешь обходить массив фигур вызывая по индексу для каждого элемента метод Draw, и у тебя каждый раз будет вызываться нужная перегрузка метода.(т.е. если пятый элемент круг то вызовется метод для круга, если квадрат то для квадрата). с перегрузкой этого сделать не получится. так что отталкивайся от своей архитектуры.
PM MAIL ICQ   Вверх
neutrino
Дата 23.11.2010, 09:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: 3
Всего: 62



Цитата(Экскалупатор @  22.11.2010,  20:56 Найти цитируемый пост)
 у тебя каждый раз будет вызываться нужная перегрузка метода.

Будет вызываться нужная реализация.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Экскалупатор
Дата 23.11.2010, 14:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



 smile 
neutrino, точно. что то я в последнее время слова забываю. к чему бы это по хаусу? к волчанке? или все же печень отказывает? надо сделать полный диализ...
PM MAIL ICQ   Вверх
666TEHb666
Дата 24.11.2010, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 5.10.2008
Где: Новокузнецк

Репутация: нет
Всего: нет



neutrino, Экскалупатор

Еще раз благодарю за ответы и участие =) Учту свою архитектуру и, думаю, оставлю перегрузку, а в первичной реализации выброшу исключение.
Вопрос решен.

Это сообщение отредактировал(а) 666TEHb666 - 24.11.2010, 18:14
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.