powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как предоставить "наружу" события "внутреннего" класса?
9 сообщений из 9, страница 1 из 1
Как предоставить "наружу" события "внутреннего" класса?
    #38061159
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток

Имеется набор интерфейсов и классов, реализующих соответствующую функциональность. Необходимо написать компонент, который будет реализовывать несколько интерфейсов из имеющихся путем использования экземпляров соответствующих классов. Проблема в том, что интерфейсы содержат не только свойства и методы, но и события. Вопрос: как организовать подписку потребителей на события встроенных в компонент экземпляров различных классов (точнее, интерфейсов)?

Примерное решение выглядит покамест вот так
Код: 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.
    public interface ISomeInterface
    {
        void SomeAction();

        event EventHandler SomeActionPerformed;
    }

    public class SomeInterfaceImpl : ISomeInterface
    {
        public void SomeAction()
        {
            var handler = SomeActionPerformed;
            if(handler != null)
                handler(this, new EventArgs());
        }

        public event EventHandler SomeActionPerformed;
    }

    public class Component : ISomeInterface, ISomeOtherInterface, IDisposable
    {
        private ISomeInterface _someInterface;

        #region ISomeInterface

        public void SomeAction()
        {
            _someInterface.SomeAction();
        }

        public event EventHandler SomeActionPerformed;

        #endregion

        public Component()
        {
            _someInterface = new SomeInterfaceImpl();
            _someInterface.SomeActionPerformed += On_someInterface_SomeActionPerformed;
        }

        ~Component()
        {
            _someInterface.SomeActionPerformed -= On_someInterface_SomeActionPerformed;
        }

        // передаю событие экземпляра SomeInterfaceImpl наружу
        void On_someInterface_SomeActionPerformed(object sender, EventArgs e)
        {
            var handler = SomeActionPerformed;
            if (handler != null)
                handler(this, e);
        }
    }




Задача наверняка тривиальная, но я как-то не сталкивался, а поиском найти не получается. Заранее большое спасибо.
...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061270
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnSparrow,
события в интерфейсе, смотрятся не очень
есть простой механизм уведомления, через интерфейсы наружу, как патерн не знаю обзывается
но много лет назад подсмотрел его в хибернете.
...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061274
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжу
есть устройство
Код: 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.
  class MyContainer<T>
    {
        private readonly T _oo;
        public MyContainer(T objectBase)
        {
            _oo = objectBase;
        }
        public void Action()
        {
            if(_oo is INotfic<T>)
            {
                ((INotfic<T>)_oo).NotificationBorn(_oo);
            }
        }
    }

    interface INotfic<in T> //Интерфейс для уведомления
    {
        void NotificationBorn(T o);
    }

    class TestBullet :INotfic<TestBullet>//Приемник событий
    {

        public void NotificationBorn(TestBullet o)
        {
            throw new NotImplementedException();
        }
    }


а вот так он действует
Код: c#
1.
2.
3.
   var d=new TestBullet();//Создаю объект, который буду скармливать механизму
            var dd=new MyContainer<TestBullet>(d);//Создаю механизм,  делаю иньекцию через конструктор
            dd.Action(); // В механизме вызываю какоето событие
...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061289
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
честно говоря, Ваш вариант очень сильно напоминает механизм слушателей Java, если я его правильно помню. Спасибо, но это, все-таки, не очень подходит. Получается, что механизм событий .NET остается не у дел, а он довольно удобен. Кроме того, можно сделать еще проще и экземпляру своего компонента передавать ссылки на методы подписчиков, которые должны вызываться при наступлении того или иного события, но это уже будет создание велосипеда (.NET events) своими руками.
...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061319
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnSparrow,
Он удобен когда контейнер запечатан, и о нем ничего не известно, и наружу торчат события, любой может подписаться
и отписаться по желанию.
У вас же наличие события у контейнера регламентируется интерфейсом, ну да бог с ним, может быть, но как там оказался тогда
тип SomeInterfaceImpl, это же нарушение сокрытия, или это атрибут запечатаного контейнера? и вы его используете как передатчик
но в тоже время принуждаете его реализовывать те же события.
В моем понимании контейнер это обособленное нечто, он генерирует события, в зависимости есть ли на них подписка или нет.
о всем остальном он ничего не знает,( мы же в контейнер снаружи ничего не всовываем?)
...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061331
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnSparrowГде-то в степи,
честно говоря, Ваш вариант очень сильно напоминает механизм слушателей Java, если я его правильно помню. Спасибо, но это, все-таки, не очень подходит. Получается, что механизм событий .NET остается не у дел, а он довольно удобен. Кроме того, можно сделать еще проще и экземпляру своего компонента передавать ссылки на методы подписчиков, которые должны вызываться при наступлении того или иного события, но это уже будет создание велосипеда (.NET events) своими руками.

Это "удобный" мехнанизм - жесткое связывание и утечки.
События в интерфейсы никто не выносит. Для слабой связанности есть готовые реализации Event Aggregator
...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061349
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
пример из поста №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.
    public class Component : ISomeInterface, ISomeOtherInterface, ...
    {
        private ISomeInterface _someInterface;

        #region ISomeInterface

        public void SomeAction()
        {
            _someInterface.SomeAction();
        }

        public event EventHandler SomeActionPerformed;

        #endregion

        public Component(ISomeInterface implementation)
        {
            Contract.Requires<ArgumentNullException>(implementation != null, "implementation");

            _someInterface = implementation;
            _someInterface.SomeActionPerformed += On_someInterface_SomeActionPerformed;
        }

        ~Component()
        {
            _someInterface.SomeActionPerformed -= On_someInterface_SomeActionPerformed;
        }

        // передаю событие экземпляра SomeInterfaceImpl наружу
        void On_someInterface_SomeActionPerformed(object sender, EventArgs e)
        {
            var handler = SomeActionPerformed;
            if (handler != null)
                handler(this, e);
        }
    }


...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061352
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,
спасибо, буду изучать.
...
Рейтинг: 0 / 0
Как предоставить "наружу" события "внутреннего" класса?
    #38061416
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnSparrow,
честно сказать, вообще обескуражен, контейнер излучает событие, и тип инжектируемый излучает событие аналогичное, и вы в контейнере пытаетесь втюхать результат события контейнера в объект который всунули в контейнер, понятно что интерфейсы и аки
базовый абстрактный не подходят, ну чтож пробуйте...
зы модератор, пож, удали меня из этого топика..
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как предоставить "наружу" события "внутреннего" класса?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]