![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Kefir |
|
|||
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 2 Всего: 87 |
САБЖ.
если развёртнуто, то допустим имеем класс
Вот, собственно и всё. Как писать объявление? Просто public List<IMyInterface> Items?.. или надо сделать что-то навроде проперти, где в set проверять поддурживается ли интерфейс?.. |
|||
|
||||
HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
Kefir, имхо public List<IMyInterface> Items - самый простой способ. Чем он плох?
|
|||
|
||||
Kefir |
|
||||
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 2 Всего: 87 |
гм.... хорошо....
делаю тогда например есть код:
тогда при компайле будет сообщение о том, что, мол, cannot implicitly convert type List<MyClass> to List<IMyInterface>. ведь MyClass имплементирует IMyInterface, тогда почему нельзя так? Или надо что-то где-то дописать? Или вообще положено писать так:
? Но ведь тогда читабельность кода страдает (не видно какой на самом деле класс в листе)... |
||||
|
|||||
Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Kefir, то, что ты хочешь, называется ковариантность коллекций и достичь этого в шарпе, увы, невозможно.
Раз ты завёл интерфейс, значит в этом месте нас не должно волновать, что под ним прячется конкретно. P.S. При том, что массивы-то ковариантны:
Вот такой нелогичный... не язык даже, а рантайм. Это сообщение отредактировал(а) Void - 28.6.2007, 14:15 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
Kefir |
|
||||||
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 2 Всего: 87 |
![]() гм.... ну я бы не сказал. в общем суть проблемы от начала до конца. у меня есть различные классы, которые будут реализовывать ICatalogueItem. есть юзер контрол, который показывает List<ICatalogueItem>. То есть примерно:
так вот. в итоге где-то я буду получать (например после общения с БД) что-нибудь а-ля:
и чтоже теперь GetAllTheDrinks(); и GetAllTheFood(); должны будут возвращать List<ICatalogueItem> вместо логичных List<Drink> и List<Food>?.. Добавлено через 7 минут и 50 секунд
забыл - меня не должно волновать в самом юзер контроле Catalogue (в данном случае) какой класс мне дают на Items - главное чтобы класс реализовывал ICatalogueItem. Это же имхо для того и сделано, чтобы там не волноваться. А снаружи-то этого класса по сути Items назначаются так как хочешь (хоть List<Tralala> или List<Ugabuga> - главное чтобы Tralala : ICatalogueItem и Ugabuga : ICatalogueItem). Вот как в том же DataGridView - дата сорц может быть любой класс, реализовавший IList (ну или что-то вроде IList). Ну так я же беру и подаю ему DataTable или DataView, а не IList. Или я снова чего-то не понял? Почему у меня в первом после и упоминается object - потому что DataSource тоже object ![]() |
||||||
|
|||||||
mihryak |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
можно выкрутиться так (используя ковариантность массивов)
рефлектором не смотрел, но вроде как серьёзных преобразований при этом не должно происходить ПС. Не забываем выставлять заранее размер коллекции в catalogue1
|
||||
|
|||||
Kefir |
|
|||
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 2 Всего: 87 |
ну что же. на безрыбье и рак - рыба. спасибо за совет, работает. хотя, конечно, некрасиво это. только я немного изменил - на:
изменил только потому, что при AddRange надо сперва сделать Clear. но это мелочи, главное то, что setter у Items не происходит, где мне надо произвести некоторые обновления. Добавлено через 2 минуты и 11 секунд ![]() хехе. ввёл в гугль строку "ковариантность коллекций" и эта тема - первый результат )) гугль |
|||
|
||||
Gelis |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 26.10.2006 Где: Брест Репутация: 2 Всего: 4 |
|
|||
|
||||
anthony |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 25.6.2007 Где: Украина Репутация: 1 Всего: 5 |
||||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Я вот никак не могу разобраться с выводом по первому примеру в указанной anthony ссылке:
В чем смысл? |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
List<T> — ссылочный тип. Если Integer — подтип Number и List<Integer> — подтип List<Number>, то должно быть возможно неявное приведение одного к другому. Таким образом, если ln присвоить li, то объявленный тип ln будет List<Number>, а фактический — List<Integer>. Когда мы добавим в ln объект типа Float, окажется, что li содержит и Integers, и Floats. И если самой коллекции может быть и всё равно, то код, работающий с ней, слегка удивиться, получив вещественное число там, где должны быть только целые.
Надо посмотреть, как это разрулено в Scala. Я только помню, что там ковариантность и контравариантность обобщённых типов указывается явно. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Idsa |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Видимо, "окажется, что ln"?
А чего это он удивится? Тип-то Number. |
||||
|
|||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Idsa, ln и li ссылаются на один и тот же объект, фактический тип которого — List<Integer>.
Кстати, глянул на коллекции в Scala. Вопрос решается вполне логично: ковариантны только неизменяемые коллекции. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [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. |