Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Наследование от интерфейса


Автор: 666TEHb666 19.11.2010, 19:38
Здравствуйте,форумчане.

      Возникла проблема с наследованием интерфейса 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.  Еще раз благодарю за помощь заранее.

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

Автор: 666TEHb666 19.11.2010, 23:10
jonie, Хмм..спасибо,учту. Думаю, если больше никто не сможет объяснить почему не работает сей задокументированный  smile  мелкомягкими способ закупорить наследуемый метод, то я воспользуюсь вашим советом. Благодарю.

Автор: Экскалупатор 20.11.2010, 00:14
Цитата(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 секунду
Цитата

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

Цитата

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

Автор: neutrino 20.11.2010, 00:23
Мне не понятен ход действий. 

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

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

Автор: Экскалупатор 20.11.2010, 00:35
может кстати имело бы смысл разделить интерфейс на несколько? более взаимосвязанных, что бы в каждом интерфейсе был необходимый минимум того что всегда обязан будет реализовывать наследник, что бы не возникало таких ситуаций при которых не нужна реализация.

Автор: neutrino 20.11.2010, 00:41
Можно. Что-то типа IDevice и IUpdatableDevice. 

Автор: 666TEHb666 21.11.2010, 15:41
Экскалупатор,neutrino, спасибо за ответы. 

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

Еще раз спасибо. Вопрос решен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)