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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сокрытие member'а интерфейса 
:(
    Опции темы
agl
  Дата 23.10.2006, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



читаю об Интерфейсах и возник следущий вопрос:
в книге пишется что если один интерфейс наследует другой интерфейс, то если сигнатура члена наследующего интерфейса совпадает с сигнатурой члена наследуемого интерфейса, то имя наследуемого интерфейса будет сокрыто.
Сделала пробную прогу:
Есть 2 интерфейса: А и B. B наследует А и имеется также класс MyClass который наследует интерфейс B.  
если прописываю код следующем образом, то все в порядке и ошибки не возникает:
Код

public interface A
    {
        void meth1();
        void meth2();
    }

    public interface B : A
    {
        new void  meth2();  //!!!!!!!!!1
        void meth3();
    }

    public class MyClass : B
    {
        public void meth1()
        {
            Console.WriteLine("Realization of meth1()");
        }

        public void meth2()
        {
            Console.WriteLine("Realization of meth2()");
        }
        public void meth3()
        {
            Console.WriteLine("Realization of meth3()");
        }
    }


ну а при следущем коде возникают ошибки:

Код

public interface A
    {
        void meth1();
        void meth2();
    }

    public interface B : A
    {
        new int  meth2();  //!!!!!!!!!!
        void meth3();
    }

    public class MyClass : B
    {
        public void meth1()
        {
            Console.WriteLine("Realization of meth1()");
        }

        public int meth2()
        {
            Console.WriteLine("Realization of meth2()");
                        return 0;
        }
        public void meth3()
        {
            Console.WriteLine("Realization of meth3()");
        }
    }


при сокрытии мемберов наследуемого класса возвратный тип функции не важен, но список параметров функции. В данном примере я изменяю возвратный тип на int и получаю ошибки:
1)если я не пользуюсь модификатором new
"The keyword new is required on 'B.meth2' because it hides inherited member"

2)появляется независимо от использования модификатора new:
'MyClass' does not implement interface member 'A.meth2'.

3)если добавить в MyClass реализацию 2 шаблонных функций одновременно, получаем ошибку:
'MyClass' already defines a member called 'meth2' with the same parameter types.

4)Спасает только явная реализация обоих методов 'meth2' (void A.meth2(){..}; int B.meth2(){ ...}; )
вопрос: в чем смысл сокрытия если я все равно должна реализовать обе функции?   smile 

PM   Вверх
Djuffin
Дата 24.10.2006, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

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



Все дело в том, что это совершенно разные функции. 
Именно поэтому их обе необходимо реализовывать.
Представь, что будет, если ты приведешь объект класса MyClass к интерфейсу A, а его функции реализованы не полностью. 
Ведь A ничего не знает, о том что его функции подменили.


Что мешает использовать одну виртуальную функцию? 


Это сообщение отредактировал(а) Djuffin - 24.10.2006, 01:53
PM MAIL   Вверх
stab
Дата 24.10.2006, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



Цитата(agl @  24.10.2006,  03:41 Найти цитируемый пост)
вопрос: в чем смысл сокрытия если я все равно должна реализовать обе функции?  


когда ты имешь ссылку на интерфейс B, то без приведения его к А, ты можешь видеть только метод meth2 из интерфейса B. правда, незнаю зачем это может понадобиться.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
mr.DUDA
Дата 24.10.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



В сигнатуру входит не только имя метода, но и тип возвращаемого значения и список аргументов.


--------------------
user posted image
PM MAIL WWW   Вверх
Exception
Дата 24.10.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

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



Ага. Просто при изменении типа значения метод считается вообще другой функцией, а при изменении списка параметров - всего-навсего перегруженной версией.
PM   Вверх
agl
Дата 24.10.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо за ответы.

2Exception
но несмотря на то, что вы говорите что при изменении возвратного типа функции метод считается совсем другим, этот другой метод скрывает метод наследуемого интерфейса, вот я и не могу понять в чем смысл сокрытия если в конце концов надо реализовывать 2 метода: и сокрытый, и тот который скрывает. 
2Djuffin 
насчет использования виртуального метода я подумаю, дело в том что я пытаюсь понять смысл изучаемого матерьяла (а учусь самостоятельно), и пока что туго smile.
PM   Вверх
stab
Дата 24.10.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



Цитата(agl @  24.10.2006,  20:08 Найти цитируемый пост)
вот я и не могу понять в чем смысл сокрытия если в конце концов надо реализовывать 2 метода: и сокрытый, и тот который скрывает. 


ну уж таковы интерфейсы, всегда надо реализовывать все методы.

моё сугубо личное мнение, ключевое слово new ввели только для того, чтобы разработчик обращал внимание на те моменты, когда в базовом и наследующем классе\интерфейсе появляется конфликт сигнатур и решал действительно ли он хочет изменить\дополнить поведение\интерфейс базового класса\интерфейса или это тупое совпадение имён методов. короче, межклассовая\межинтерфейсная "перегрузка" методов довольно опасна, особенно если код предка-потомка пишется разными людьми.

в любом случае, вот пример того, как это можно использовать:

Код

public interface ICanWalk
{
    bool NavigateTo(Point point);
}

public interface ICanWalkAndSwim: ICanWalk
{
    new bool NavigateTo(Point point);
}

public class Human: ICanWalkAndSwim
{
    bool ICanWalkAndSwim.NavigateTo(Point point)
    {
        return WalkSwimTo(point);
    }

    bool ICanWalk.NavigateTo(Point point)
    {
        return WalkTo(point);
    }
}


т.е. человека можно попросить только пройтись или пройтись\доплыть до требуемой точки,  в зависимости от того, как мы его рассматриваем, т.е. от того, какой интерфейс используем.

Добавлено @ 17:07 
.. кстати, а я плавать не умею, так что эксепшены код выдаст.  smile  smile  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
agl
Дата 25.10.2006, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



cully, большое спасибо за пример и ответ.

Это сообщение отредактировал(а) agl - 25.10.2006, 00:09
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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