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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Причины явной реализации членов интерфейса 
:(
    Опции темы
mastermedia
Дата 21.1.2012, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

interface IEven { 
  bool IsOdd(int x); 
  bool IsEven(int x); 

 
class MyClass : IEven { 
 
  bool IEven.IsOdd(int x) { 
    if((x%2) != 0) return true; 
    else return false; 
  } 
 
  // Normal implementation. 
  public bool IsEven(int x) { 
    IEven o = this; //объясните данный участок кода
 
    return !o.IsOdd(x); 
  } 

 
class Demo { 
  static void Main() { 
    MyClass ob = new MyClass(); 
    bool result; 
 
    result = ob.IsEven(4); 
    if(result) Console.WriteLine("4 is even."); 
 
    // result = ob.IsOdd(4); // Error, IsOdd not exposed. 
  
    IEven iRef = (IEven) ob; // объясните данный участок кода
    result = iRef.IsOdd(3); 
    if(result) Console.WriteLine("3 is odd."); 
 
  } 
}

PM MAIL   Вверх
ShavarRsh
Дата 22.1.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



При явной реализации функцию можно вызвать только через интерфейс. Это нужно в ситуации, когда мы реализум 2 интерфейса с одинаковой функцией. И вызывающий код должен явно указать реализацию какого интерфейса надо использовать. 
Допустим есть второй интерфейс IEven2 у которого тоже есть функция bool IsEven(int x);
class MyClass : IEven, IEven2 { 
 
  bool IEven.IsOdd(int x) { 
    if((x%2) != 0) return true; 
    else return false; 
  } 

  bool IEven2.IsOdd(int x) { 
    Console.WriteLine("IEven2 is called");
    if((x%2) != 0) return true; 
    else return false; 
  } 
 
  // Normal implementation. 
  public bool IsEven(int x) { 
    IEven o = this; //объясните данный участок кода
 
    return !o.IsOdd(x); 
  } 


и теперь только клиент этого класса должен решить какую из реализаций он хочет вызвать:

IEven iRef = (IEven) ob; 
result = iRef.IsOdd(3);// вызовется IEven.IsOdd

IEven2 iRef = (IEven2) ob; 
result = iRef.IsOdd(3);// вызовется IEven2.IsOdd (которая напишет строчку в консоль)
PM MAIL   Вверх
jonie
Дата 25.1.2012, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а я еще пример видел например в Dictionary<T> - он скрывает методы ICollection<T> неудобные : такие как Add(KeyValuePair<K,V> item)
Они неудобны, т.к. есть идентичные им методы IDictioary<T> Add(K key, V value) и раздувают видимый интерфейс при использовании Dictionary<K,V> явным образом...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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