LoveRead.info » Книги » Разная литература » Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Книгу Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория» читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

301 0 18:01, 17-10-2023

Книга Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория» читать онлайн бесплатно без регистрации

Большой и увлекательный, научно-прикладной, образовательный, некоммерческий интернет-журнал, созданный группой энтузиастов. Журнал содержит материалы, найденные в Интернет или написанные для Интернет. Основная тематика статей — то, что можно сделать самому, от садовых поделок до сверхпроводников, но есть и просто полезные материалы.

    1 ... 372 373 374 375 376 377 378 379 380 ... 415
    Перейти на страницу:
    свойства. В качестве компенсации в класс следует добавить конструктор с аргументом, что позволит в классе, создающем событие, создавать объект класса ChangedEventArgs с нужным значением свойства item. Приведу соответствующий код:

    public object Item

    {

        get {return(item);}

        //set { item = value;}

    }

    public ChangedEventArgs(object item)

    {

        this.item = item;

    }

    • В методы класса ListWithChangedEvent, зажигающие события, нужно ввести изменения. Теперь перед каждым вызовом нужно создавать новый объект, задающий аргументы. Вот измененный код:

    public override int Add(object value)

    {

        int i=0;

        ChangedEventArgs evargs = new ChangedEventArgs(value);

        //evargs.Item = value;

        OnChanged(evargs);

        if (evargs.Permit) i = base.Add(value);

        else

              Console.WriteLine("Добавление элемента запрещено." +

                   "Значение = {0}", value);

        return i;

    }

    public override void Clear()

    {

        ChangedEventArgs evargs = new ChangedEventArgs(0);

        //evargs.Item=0;

        OnChanged(evargs);

        base.Clear();

    }

    public override object this[int index]

    {

        set

        {

            ChangedEventArgs evargs = new ChangedEventArgs(value);

            //evargs.Item = value;

            OnChanged(evargs);

            if (evargs.Permit)

                base[index] = value;

            else

                 Console.WriteLine("Замена элемента запрещена." +

                     " Значение = {0}", value);

        }

        get {return(base[index]);}

    }

    Таким образом, обработчикам можно запретить изменение входных аргументов события. Но есть еще выходные аргументы события, значения которых определяются в обработчике; в нашем примере это аргумент Permit.

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

    Эта проблема остается открытой, в языке C# здесь "дыра" — нет специальных средств, позволяющих избежать или, по крайней мере, предупредить о возникновении подобной ситуации. Вся ответственность лежит на программисте, который может выбрать некоторую стратегию решения проблемы, отдавая, например, предпочтение решению одного из обработчиков или вырабатывая итоговое решение, учитывающее все частные решения.

    Итак, если событие имеет аргументы, то все входные аргументы должны быть закрыты для обработчиков события. Если обработчиков несколько, то лучше или не использовать выходных аргументов, или аккуратно запрограммировать логику обработчиков, которая учитывает решения, полученные коллегами — ранее отработавшими обработчиками события.

    Классы с большим числом событий

    Как было сказано, каждое событие класса представляется полем этого класса. Если у класса много объявленных событий, а реально возникает лишь малая часть из них, то предпочтительнее динамический подход, когда память отводится только фактически возникшим событиям. Это несколько замедляет время выполнения, но экономит память. Решение зависит от того, что в данном контексте важнее — память или время. Для реализации динамического подхода в языке предусмотрена возможность задания пользовательских методов Add и Remove в момент объявления события. Это и есть другая форма объявления события, упоминавшаяся ранее. Вот ее примерный синтаксис:

    public event <Имя Делегата> <Имя события>

    {

        add {…}

        remove {… }

    }

    Оба метода должны быть реализованы, при этом для хранения делегатов используется некоторое хранилище. Именно так реализованы классы для большинства интерфейсных объектов, использующие хэш-таблицы для хранения делегатов.

    Давайте построим небольшой пример, демонстрирующий такой способ объявления и работы с событиями. Вначале построим класс с несколькими событиями:

    class ManyEvents

    {

        //хэш таблица для хранения делегатов

         Hashtable DStore = new Hashtable();

         public event EventHandier Evl

         {

             add

             {

             DStore["Evl"]= (EventHandier)DStore["Evl"]+ value;

             }

             remove

             {

                   DStore["Evl"]= (EventHandier)DStore["Evl"] - value;

             }

        }

        public event EventHandier Ev2

        {

            add

            {

                 DStore["Ev2"]= (EventHandier)DStore["Ev2"]+ value;

            }

            remove

            {

                 DStore["Ev2"]= (EventHandier)DStore["Ev2"] - value;

            }

        }

        public event EventHandier Ev3

        {

            add

            {

                 DStore["Ev3"]= (EventHandier)DStore["Ev3"]+ value;

            }

            remove

            {

                  DStore["Ev3"]= (EventHandier)DStore["Ev3"] - value;

            }

       }

       public event EventHandier Ev4

       {

            add

            {

                 DStore["Ev4"]= (EventHandler)DStore["Ev4"] - value;

            }

            remove

            }   

                DStore["Ev4"]= (EventHandler)DStore["Ev4"] - value;

            }

        }

        public void SimulateEvs()

        {

            EventHandler ev = (EventHandler) DStore["Ev1"];

            if(ev!= null) ev(this, null);

            ev = (EventHandler) DStore["Ev3"];

            if(ev!= null) ev(this, null);

         }

    }//class ManyEvents

    В нашем классе созданы четыре события и хэш-таблица DStore для их хранения. Все события принадлежат встроенному классу EventHandler. Когда к событию будет присоединяться обработчик, автоматически будет вызван метод add, который динамически создаст элемент хэш-таблиц. Ключом элемента является, в данном случае, строка с именем события. При отсоединении обработчика будет исполняться метод remove, выполняющий аналогичную операцию над соответствующим элементом хэш-таблицы. В классе определен также метод SimulateEvs, при вызове которого зажигаются два из четырех событий — Ev1 и Ev3.

    Рассмотрим теперь класс ReceiverEvs, слушающий события. Этот класс построен по описанным ранее правилам. В нем есть ссылка на класс, создающий события; конструктор с параметром, которому передается реальный объект такого класса; четыре обработчика события — по одному на каждое, и метод OnConnect, связывающий обработчиков с событиями. Вот код класса:

    class ReceiverEvs

    {

        private ManyEvents manyEvs;

        public ReceiverEvs(ManyEvents manyEvs)

        {

            this.manyEvs = manyEvs;

            OnConnect ();

        }

        public void OnConnect ()

        {

             manyEvs.Ev1 += new EventHandler(H1);

             manyEvs.Ev2 += new EventHandler(H2);

             manyEvs.Ev3 += new EventHandler (H3);

             manyEvs.Ev4 += new EventHandler(H4);

        }

        public void HI (object s, EventArgs e)

        {

              Console.WriteLine("Событие Ev1");

        }

    1 ... 372 373 374 375 376 377 378 379 380 ... 415
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Валентина Валентина04 июль 13:25 Большое спасибо за интересную тему.  Сюжет заманчиввй,интересный. Жду продолжения ... Лекарь Фамильяров. Том 7 - Александр Лиманский
    2. Наталья По Наталья По01 июль 10:12 Ужасный перевод:(... Аркадия - Эрин Дум
    3. Вика Вика29 июнь 21:56 Какая хрень с первых строк.  У ребенка в 14 месяце не может быть черепно мозговой травмы при падании с дивана ... Вернуть семью любой ценой - Чарли Ви
    Все комметарии
    Новинки бесплатной онлайн библиотеки