|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#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. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
Задача наверняка тривиальная, но я как-то не сталкивался, а поиском найти не получается. Заранее большое спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 18:50 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#18+
JohnSparrow, события в интерфейсе, смотрятся не очень есть простой механизм уведомления, через интерфейсы наружу, как патерн не знаю обзывается но много лет назад подсмотрел его в хибернете. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 21:01 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#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.
а вот так он действует Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 21:04 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#18+
Где-то в степи, честно говоря, Ваш вариант очень сильно напоминает механизм слушателей Java, если я его правильно помню. Спасибо, но это, все-таки, не очень подходит. Получается, что механизм событий .NET остается не у дел, а он довольно удобен. Кроме того, можно сделать еще проще и экземпляру своего компонента передавать ссылки на методы подписчиков, которые должны вызываться при наступлении того или иного события, но это уже будет создание велосипеда (.NET events) своими руками. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 21:15 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#18+
JohnSparrow, Он удобен когда контейнер запечатан, и о нем ничего не известно, и наружу торчат события, любой может подписаться и отписаться по желанию. У вас же наличие события у контейнера регламентируется интерфейсом, ну да бог с ним, может быть, но как там оказался тогда тип SomeInterfaceImpl, это же нарушение сокрытия, или это атрибут запечатаного контейнера? и вы его используете как передатчик но в тоже время принуждаете его реализовывать те же события. В моем понимании контейнер это обособленное нечто, он генерирует события, в зависимости есть ли на них подписка или нет. о всем остальном он ничего не знает,( мы же в контейнер снаружи ничего не всовываем?) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 21:46 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#18+
JohnSparrowГде-то в степи, честно говоря, Ваш вариант очень сильно напоминает механизм слушателей Java, если я его правильно помню. Спасибо, но это, все-таки, не очень подходит. Получается, что механизм событий .NET остается не у дел, а он довольно удобен. Кроме того, можно сделать еще проще и экземпляру своего компонента передавать ссылки на методы подписчиков, которые должны вызываться при наступлении того или иного события, но это уже будет создание велосипеда (.NET events) своими руками. Это "удобный" мехнанизм - жесткое связывание и утечки. События в интерфейсы никто не выносит. Для слабой связанности есть готовые реализации Event Aggregator ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 22:04 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#18+
Где-то в степи, пример из поста №1 опускает целую массу различных моментов с тем, чтобы передать суть вопроса. В реальности происходит инъекция SomeInterfaceImpl. примерно вот так Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 22:42 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#18+
SeVa, спасибо, буду изучать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2012, 22:49 |
|
Как предоставить "наружу" события "внутреннего" класса?
|
|||
---|---|---|---|
#18+
JohnSparrow, честно сказать, вообще обескуражен, контейнер излучает событие, и тип инжектируемый излучает событие аналогичное, и вы в контейнере пытаетесь втюхать результат события контейнера в объект который всунули в контейнер, понятно что интерфейсы и аки базовый абстрактный не подходят, ну чтож пробуйте... зы модератор, пож, удали меня из этого топика.. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2012, 00:23 |
|
|
start [/forum/topic.php?fid=20&fpage=185&tid=1405556]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 326ms |
total: | 482ms |
0 / 0 |