Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Причины явной реализации членов интерфейса


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

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."); 
 
  } 
}

Автор: ShavarRsh 22.1.2012, 16:37
При явной реализации функцию можно вызвать только через интерфейс. Это нужно в ситуации, когда мы реализум 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 (которая напишет строчку в консоль)

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

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