![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
mastermedia |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 31.10.2010 Репутация: нет Всего: нет |
Шилдт описывает две причины явной реализации членов интерфейсов, но мне не понятна одна из них. Вот, что он пишет: когда интерфейсный метод реализуется с указанием его полного имени, то такой метод оказывается доступным не посредством объектов класса, реализующего данный интерфейс, а по интерфейсной ссылке. Следовательно, явная реализация позволяет реализовать интерфейсный метод таким образом, чтобы он не стал открытым членом класса, предоставляющего его реализацию. Мне не понятно смысл описанного и причина когда это нужно использовать и зачем. В книге приводится следующий пример, я пометил комментарии что мне не понятно также в коде:
|
|||
|
||||
ShavarRsh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 (которая напишет строчку в консоль) |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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> явным образом... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |