|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Доброго дня! Уважаемые форумчане) Подскажите пожалуйста, реально ли каким-то образом заставить ниже приведённый код работать? Или в шарпе настолько строгая типизация, что даже наследованный интерфейс классом, не преобразуется в шарпе. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 15:12 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
читай про ковариантность и контравариантность ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 15:17 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Shocker.Pro, Прочитал Но в данном случае нужно использовать джинерик интерфеёсы, а я то использую простой интерфейс. Как быть тогда? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 15:35 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Expression инвариантен. Что мешает объявить Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 16:37 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Shocker.Pro Expression инвариантен. Что мешает объявить Код: c# 1.
Можете показать как сделать, просто я что-то не догоняю) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 17:58 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
А то, что я написал, это не считается, что я показал? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 18:00 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Shocker.Pro А то, что я написал, это не считается, что я показал? Нет, мне надо чтобы метод Reload использовал TEntity! Для того чтобы я мог в случае необходимости отправить другой интерфейс, к примеру IBaseVisible и др. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 18:12 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Идея реализовать что-то вот это: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Ну и как вы уже понимаете в фильтр может быть не только интерфейс, но и Entity1 и Entity2 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 18:23 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Nechto Shocker.Pro А то, что я написал, это не считается, что я показал? Нет, мне надо чтобы метод Reload использовал TEntity! Для того чтобы я мог в случае необходимости отправить другой интерфейс, к примеру IBaseVisible и др. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Вы же ограничили TEntity как IBase, вот с ним и работайте дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 23:13 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Или так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Но фильтр нужно будет задавать конкретно: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2019, 23:24 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Все варианты решения, которые вы предложили они мне не совсем подходят. Мне нужна универсальность. Чтобы оба варианта работали, а в данном случае работает только первый. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Сам код я его немного доработал: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 10:41 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Я не понимаю, какая универсальность тебе нужна. У тебя TEntity ограничен IBase. Всё. Ты не сможешь использовать никакие члены, кроме членов IBase, поэтому метод можно смело делать IBase. Если ты планируешь использовать прямое приведение к типу Entity1 - это пахнет говнокодом. А если собираешься использовать рефлексию, то вообще всё равно, что у тебя там написано. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 10:46 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Shocker.Pro Я не понимаю, какая универсальность тебе нужна. У тебя TEntity ограничен IBase. Всё. Ты не сможешь использовать никакие члены, кроме членов IBase, поэтому метод можно смело делать IBase. Если ты планируешь использовать прямое приведение к типу Entity1 - это пахнет говнокодом. А если собираешься использовать рефлексию, то вообще всё равно, что у тебя там написано. Почему я не могу привести IBase к Entity1? Это вообще возможно в c#? Код: c# 1. 2.
Ну а если убрать public abstract class AbstrReload<TEntity> where TEntity : class, IBase ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 12:28 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Я уже сказал - пахнет говнокодом. Зачем тебе нужна абстракция IBase, если ты хочешь приводить к конкретным типам? Используй более общую абстракцию тогда, вплоть до object ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 12:40 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Shocker.Pro Я уже сказал - пахнет говнокодом. Зачем тебе нужна абстракция IBase, если ты хочешь приводить к конкретным типам? Используй более общую абстракцию тогда, вплоть до object Понять не могу, в чем говнокод? Простое приведение интерфейса к классу. Объясните пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 12:47 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Если вызывающий класс зависит от вызываемого, а вызываемый класс зависит от вызывающего. Можно выкинуть все интерфейсы и обобщенные члены, потому что смысл абстракции пропадает. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 12:50 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Nechto Понять не могу, в чем говнокод? Простое приведение интерфейса к классу. Объясните пожалуйста Чего тут объяснять? Суть интерфейса в сокрытии реализации. Когда вы приводите интерфейс к классу, смысл в интерфейсе пропадает начисто. Передавайте всё тупо через ссылку на object тогда и везде приводите к нужному классу. Посмотрите что ваши коллеги на это скажут )) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:03 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
по сути, это нарушение принципа Барбары Лисков (SOLID), когда мы абстракцию приводим к её реальному типу. Если вы подмените для этой абстракции реализацию, работать не будет, следовательно, это говнокод. То есть абстракция тут хоть и есть, но она абсолютно бессмыслена и бесполезна Пример ковариативности\контрвариантивности Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:12 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
hVostt Nechto Понять не могу, в чем говнокод? Простое приведение интерфейса к классу. Объясните пожалуйста Чего тут объяснять? Суть интерфейса в сокрытии реализации. Когда вы приводите интерфейс к классу, смысл в интерфейсе пропадает начисто. Передавайте всё тупо через ссылку на object тогда и везде приводите к нужному классу. Посмотрите что ваши коллеги на это скажут )) Я вас понял. Почему тогда это не говно код? Потому что Entity1 уже реализован? Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:24 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Nechto hVostt пропущено... Чего тут объяснять? Суть интерфейса в сокрытии реализации. Когда вы приводите интерфейс к классу, смысл в интерфейсе пропадает начисто. Передавайте всё тупо через ссылку на object тогда и везде приводите к нужному классу. Посмотрите что ваши коллеги на это скажут )) Я вас понял. Почему тогда это не говно код? Потому что Entity1 уже реализован? Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 13:25 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Nechto Я вас понял. Почему тогда это не говно код? Потому что Entity1 уже реализован? Код: c# 1. 2. 3.
смотрите, я вам покажу какую штуку: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
что мы сделали? стали использовать Lambda Expression по прямому назначению: Код: c# 1. 2. 3.
собственно, вы перепутали спецификации с лямбды, которые не смотря на внешнюю похожесть, работают и используются совершенно по-разному. лябмды используются функционально , спецификации императивно . обратите внимание на интерфейс IQueryable<T> -- вместо того, чтобы собирать ваше условие отдельно и передавать, вы собираете результат каждый раз получая новый результат после применения операции: query.Where(...).Where(...).Where(...) вы же пытаетесь функциональные лябмды сделать императивными, и страдаете. дальше будет -- хуже. я вам обещаю, это ещё цветочки. огребёте граблями по всему прыщавому лбу )) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 16:26 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
hVostt дальше будет -- хуже. я вам обещаю, это ещё цветочки. огребёте граблями по всему прыщавому лбу )) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 22:01 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
hVostt дальше будет -- хуже. я вам обещаю, это ещё цветочки. Согласен! Похоже, что я хочу концепция c# не хочет) Видимо нужно менять структуру проекта. Либо не хватает знаний, для того чтобы создавать универсальные алгоритмы работы с типами в реалтайме( Короче, я уже сам запутался. Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 10:12 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
Nechto Либо не хватает знаний, для того чтобы создавать универсальные алгоритмы работы с типами в реалтайме( Короче, я уже сам запутался. Код: c# 1. 2. 3. 4. 5.
да что тут думать, играйтесь с абстракциями, если есть время и ресурсы -- получайте опыт но универсализация это не панацея, смотрите какой ценой вы добиваетесь универсальности зачастую, оно того не стоит обратите внимания на паттерны и принципы разработки (GOF, SOLID, KISS..) Expression в рантайме тоже используется, и активно, но не для лямбд для генерации кода, оптимизации, но не для целевых задач ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 10:28 |
|
c# не соответствие классов с интерфейсом
|
|||
---|---|---|---|
#18+
hVostt Expression в рантайме тоже используется, и активно, но не для лямбд для генерации кода, оптимизации, но не для целевых задач Чтобы дожать тему, решил сегодня поразбираться и вот что у меня получилось: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Так активно используют Expression в реалтайме? Или этот код, тоже можно отнести к мусорному? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 15:05 |
|
|
start [/forum/topic.php?fid=20&fpage=13&tid=1398675]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
132ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 237ms |
0 / 0 |