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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование от интерфейса, Проблема с нереалиованным методом 
V
    Опции темы
666TEHb666
Дата 19.11.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте,форумчане.

      Возникла проблема с наследованием интерфейса Device классом Display.  При наследовании передается метод Update,который нет необходимости реализовывать. Хотелось бы его не оставлять пустым аля public void Update {} .
Пробежался по сайтам разным,в том числе и msdn. В msdn предлагается вполне реальная возможность с использованием абстрактного метода при наследовании. В идеале, если я пропишу в наследуемом классе public abstract void Update(); , то мои траблы будут решены. Сделал также, но компилятор ругается мол метод абстрактный в интерфейсе объявлен как неабстрактный. Как я понимаю нет смысла да и не получится объявить в интерфейсе метод абстрактным. Кто знает в чем проблема и как ее решить? Буду благодарен за помощь. И, если ошибка нелепая(где-то что-то упускаю),прошу извинить за отнятое время на просмотр этой темы и указать на нее.

Код прилагаю:

Код

     /// <summary>
    /// Устройство.
    /// </summary>
    /// <remarks>Интерфейс компьютерного устройства.</remarks>
    interface Device
    {
        #region методы
        /// <summary>
        /// Обновление.
        /// </summary>
        /// <remarks>Проверка на изменения состояний устройств и вызов соответствующих действий.</remarks>
        /// <returns>Нет возвращаемого значения.</returns>
        void Update();
        #endregion

//...

 public class Display : Device
    {
        /// <summary>Ширина экрана монитора.</summary>
        public readonly int Width;
        /// <summary>
        /// высота экрана монитора в пикселях.
        /// </summary>
        public readonly int Height;

        public Display(int GD_width, int GD_height) 
        {
            Width = GD_width;
            Height = GD_height;
        }

        public abstract void Update();
    }
    
//...


Вот ссылка на схожий пример в msdn (там в самом низу примера схожая ситуация):
http://msdn.microsoft.com/ru-ru/library/sf985hc5.aspx

P.S. Проект будет большой и не хотелось бы в самом его начале создавать путаницу и мешанину. Так то,конечно можно было бы и оставить фиктивную реализацию метода как я сказал вначале этого сообщения. Если имеет какое-то значение,хотя наврядли, то пишу на Visual Studio Ultimate 2010 с лицензией, использую XNA 4.  Еще раз благодарю за помощь заранее.
PM MAIL ICQ Skype   Вверх
jonie
Дата 19.11.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Если вам просто не нужна реализация и вы боитесь что кто-то Все-таки вызовет этот метод, то сделайте у нем выброс эксепшена типа throw new NotImplementedException() или NotSupportedException....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
666TEHb666
Дата 19.11.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



jonie, Хмм..спасибо,учту. Думаю, если больше никто не сможет объяснить почему не работает сей задокументированный  smile  мелкомягкими способ закупорить наследуемый метод, то я воспользуюсь вашим советом. Благодарю.
PM MAIL ICQ Skype   Вверх
Экскалупатор
Дата 20.11.2010, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(666TEHb666 @  19.11.2010,  18:38 Найти цитируемый пост)
Сделал также, но компилятор ругается мол метод абстрактный в интерфейсе объявлен как неабстрактный.

у меня студия ругается только в том случае если класс содержащий абстрактный метод сам является не абстрактным.
но так все работает:
Код

interface I
    {
        void II();
    }
    abstract class AA : I
    {
        public abstract void II();
    }
    class A : AA
    {
        public override void II()
        {
            throw new NotImplementedException();
        }
    }


может я не совсем понял что имеется ввиду под "задокументированный  smile  мелкомягкими способ", но по ссылке ни о каких закупориваниях речь вроде не шла...

Добавлено через 4 минуты и 51 секунду
Цитата

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

Цитата

Объявления абстрактных методов допускаются только в абстрактных классах

PM MAIL ICQ   Вверх
neutrino
Дата 20.11.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


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

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



Мне не понятен ход действий. 

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

Нельзя объявить абстрактный метод в неабстрактном классе.


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

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


Эксперт
***


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

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



может кстати имело бы смысл разделить интерфейс на несколько? более взаимосвязанных, что бы в каждом интерфейсе был необходимый минимум того что всегда обязан будет реализовывать наследник, что бы не возникало таких ситуаций при которых не нужна реализация.
PM MAIL ICQ   Вверх
neutrino
Дата 20.11.2010, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


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

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



Можно. Что-то типа IDevice и IUpdatableDevice. 


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

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


Шустрый
*


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

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



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

Действительно ошибся с объявлением абстрактных методов в неабстрактных классах. Сонный уже был и невнимательно мсдн читал видно. 
Скорее всего действительно разделю на 2 интерфейса.

Еще раз спасибо. Вопрос решен.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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