![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Madferit |
|
|||
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 11.7.2005 Где: Запорожье Репутация: 1 Всего: 1 |
Смутил один момент:
Интерфейс IList наследует интерфейсы ICollection и IEnumerable. Хотя ICollection уже наследует IEnumerable. Тоже самое с IDictionary - он тоже наследует и ICollection, и IEnumerable. Тоже самое с интерфейсами в System.Collections.Generic. Насколько я понимаю интерфейсы в .NET, наследовать ICollection было бы достаточно, а наследование IEnumerable уже избыточно. Тогда c какой целью явно указывается IEnumerable в предках? Для пущей ясности? |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
хм, интересный вопрос. для повышения выразительность - единственное что приходит в голову. может быть конечно это эволюционные дела, но это маловероятно.
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
tol05 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
![]() Пример
Дело в том, что методы с явной реализацией не наследуется и в каждом дочернем классе нужно опять наследоваться от одного и того же интерфейса и снова и снова переопределять методы. Вот так работает:
теперь будет работать
Рихтер, "наследование интерфейсов":
-------------------- На хорошей работе и сны хорошие снятся. |
||||||||
|
|||||||||
0000 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.7.2006 Где: Нижний Новгород Репутация: 2 Всего: 5 |
tol05,
твой пример с классами - тут вопросов нет, все чинно с явной реализацией методов интерфейсов... а вопрос-то в другом... зачем при реализации IList явно прописывать наследование и от ICollection и от IEnumerable, ведь ICollection уже наследует IEnumerable...тут суть не в классах, а в самих интерфейсах... лично мне это тоже не совсем понятно зачем так делают |
|||
|
||||
tol05 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
да по тем же причинам.
Я же писал: реализация интерфейса наследнику не передается допустим
так можно
так нельзя
а если в каком-нибудь промежуточном интерфейсе повторить наследование, то
видно, как показал реальный юзинг интерфейсов, иногда нужно F1() вызывать через ссылку на базовый интерфейс, а иногда - через ссылку на производный. В зависимости от того, к ссылке какого интерфейса в реальном коде приводится объект, будет зависеть интерфейс доступа у объекту (с любом случае ведь работа будет с объектом, а не с декларацией его возможностей), ну и сами функциональные возможности. Это сообщение отредактировал(а) tol05 - 4.11.2007, 22:02 -------------------- На хорошей работе и сны хорошие снятся. |
||||||||
|
|||||||||
0000 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.7.2006 Где: Нижний Новгород Репутация: 2 Всего: 5 |
согласно твоей логике так делать нельзя??? или мы опять недопоняли друг друга?? ![]() может вопрос по разному поняли....хм..но ведь в реализации ArrayList никаких явных методов интерфейсов нет, если верить перехоту по "Go to definition" Это сообщение отредактировал(а) 0000 - 4.11.2007, 22:38 |
|||
|
||||
0000 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.7.2006 Где: Нижний Новгород Репутация: 2 Всего: 5 |
tol05, похоже я немного невнимательно прочитал твой пост...
как раз сейчас хотел сказать про интерфейсы, в которых содержатся методы с одинаковыми именами...вот тут такое наследование будет иногда полезно. но... в IList и ICollection вроде нет одинаковых |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
'IMyInterface.F1': explicit interface declaration can only be declared in a class or struct, что вполне логично, т.к. new задаёт новую реализацию, а не новый интерфейс. интерфейс не может специфицировать необходимость реализации одного и тоже интерфейса более одного раза. в этом просто нет смысла, интерфейс в каждом конкретном типе всегда имеет только одну реализацию. как так? передаётся всегда. Рихтер писал про невозможность неявного частичного переопределения реализации интерфейса, если в базовых классах он не на явных виртуальных членах сделан, но не про отсутствие наследования. но даже в этом случае полиморфное поведение сохраняется, т.к. вызываемая реализация зависит от типа. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
tol05 |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
я имел в виду явную реализацию интерфейса.
так нельзя
так можно
а по поводу нескольких реализаций в одном типе... тут тонкий момент ![]() работа interface mapping :
запускаем и получаем
раскомментируем, запускаем и получаем
т.е. оба метода, в принципе, являются реализацией интерфейса. Мы меняем сопоставление реализации с интерфейсом. И имеем две реализации одного и того же интерфейса. -------------------- На хорошей работе и сны хорошие снятся. |
||||||||||
|
|||||||||||
0000 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.7.2006 Где: Нижний Новгород Репутация: 2 Всего: 5 |
явная реализация интерфейса не передается в наследовании от класса к классу..но ведь если твой IA унаследовать от скажем IB, а тот от IC, то в классе D ты сможешь выполнить явную реализацию всех методов из всех трех интерфейсов...не обязательно при этом явно прописывая наследоание IA от IC..
|
|||
|
||||
Jlekc |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 520 Регистрация: 10.2.2005 Где: Leopolis Репутация: 1 Всего: 4 |
Явная реализация интерфейсов, хмм.
Разговор начился с интерфейса IList, если посмотреть где он используеться - ArrayList например. При наследовании IList, также наследуеться и вся цепочка интерфейсов: ICollection, IEnumerable. И почему-то невидно никакой явной реализации интерфейсов. Похоже это замечание было самым верным Добавлено через 14 минут и 51 секунду ЗЫ: Прошолся по сборке генератором доков Sandcastle. В сборке два класса - один наследует IList, второй IList и всю цепочку его интерфейсов. Как и ожидалось в хелпаке для первого класса видно только IList, для второго все интерфейсы. -------------------- |
|||
|
||||
0000 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.7.2006 Где: Нижний Новгород Репутация: 2 Всего: 5 |
вот я про то же и говорил, что при желании явно реализовать методы из IEnumerable можно, явно не наследуя.. |
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
да. Похоже и я с этим соглашусь. По крайней мере проимитировать ситуации, где бы повторное наследование сыграло бы роль, у меня не получилось.
Одним словом, написал в этом топике много, да большей частью, не по теме ![]() -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
0000 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.7.2006 Где: Нижний Новгород Репутация: 2 Всего: 5 |
народ..кажется разобрался я с этим вопросом..все выходные он меня мучал и тут прозвучала гениальная идея от одного чела - чтобы было быстрее!!!..начал копаться..
оператор foreach работает так, что в коллекции, для которой он вызывается должен содержаться метод
так вот, самый медленный вариант - это просто когда компилятор получит список методов для нашей коллекции...самый быстрый, проверить, а не реализовывает ли наша коллекция интерфейс IEnumerable.. так вот если явно имплементировать IEnumerable, доступ к элементам колекции через foreach будет быстрее...а поскольку этот оператор используется очень часто для коллекций - вполне актуально, мто разработчики FCL вынесли явное наследование от IEnumerable... Это сообщение отредактировал(а) 0000 - 6.11.2007, 12:16 |
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Поскольку любая коллекция содержит в себе массив, то для скорости было бы логичнее, чтобы каждая коллекция предоставляла открытое свойство типа Array. Но это огромная дыра в защите кода. Дырище просто... Поэтому IEnumerable используется для защищенности коллекции а не для скорости.
А во-вторых... Поскольку я влез в тему с агресивными опровержениями ![]() А по поводу ре-имплементации интерфейса в иерархии наследования интерфейсов - ни ECMA, ни MVP с "русско-неговорящих" сайтов - никто ничего не говорит. А некоторые (и я в их числе ![]() вот так вот-с ![]() -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |