Рейтинговые книги
Читем онлайн C# 4.0: полное руководство - Герберт Шилдт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 129 130 131 132 133 134 135 136 137 ... 294

И наконец, событие запускается, как показано ниже.

// Запустить событие,

evt.OnSomeEvent();

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

Пример групповой адресации события

Как и делегаты, события поддерживают групповую адресацию. Это дает возможность нескольким объектам реагировать на уведомление о событии. Ниже приведен пример групповой адресации события.

// Продемонстрировать групповую адресацию события,

using System;

// Объявить тип делегата для события,

delegate void MyEventHandler() ;

// Объявить делегат, содержащий событие,

class MyEvent {

  public event MyEventHandler SomeEvent;

  // Этот метод вызывается для запуска события,

  public void OnSomeEvent() {

    if(SomeEvent != null)

      SomeEvent();

  }

}

class X {

  public void Xhandler() {

    Console.WriteLine("Событие получено объектом класса X");

  }

}

class Y {

  public void Yhandler() {

    Console.WriteLine("Событие получено объектом класса Y");

  }

}

class EventDemo2 {

  static void Handler() {

    Console.WriteLine("Событие получено объектом класса EventDemo");

  }

  static void Main() {

    MyEvent evt = new MyEvent();

    X xOb = new X();

    Y yOb = new Y();

    // Добавить обработчики в список событий.

    evt.SomeEvent += Handler;

    evt.SomeEvent += xOb.Xhandler;

    evt.SomeEvent += yOb.Yhandler;

    // Запустить событие, evt.OnSomeEvent() ;

    Console.WriteLine() ;

    // Удалить обработчик.

    evt.SomeEvent -= xOb.Xhandler;

    evt.OnSomeEvent() ;

  }

}

При выполнении кода этого примера получается следующий результат.

Событие получено объектом класса EventDemo

Событие получено объектом класса X

Событие получено объектом класса Y

Событие получено объектом класса EventDemo

Событие получено объектом класса Y

В данном примере создаются два дополнительных класса, X и Y, в которых также определяются обработчики событий, совместимые с делегатом MyEventHandler. Поэтому эти обработчики могут быть также включены в цепочку событий. Обратите внимание на то, что обработчики в классах X и Y не являются статическими. Это означает, что сначала должны быть созданы объекты каждого из этих классов, а затем в цепочку событий должны быть введены обработчики, связанные с их экземплярами. Об отличиях между обработчиками экземпляра и статическими обработчиками речь пойдет в следующем разделе.

Методы экземпляра в сравнении со статическими методами в качестве обработчиков событий

Методы экземпляра и статические методы могут быть использованы в качестве обработчиков событий, но между ними имеется одно существенное отличие. Когда статический метод используется в качестве обработчика, уведомление о событии распространяется на весь класс. А когда в качестве обработчика используется метод экземпляра, то события адресуются конкретным экземплярам объектов. Следовательно, каждый объект определенного класса, которому требуется получить уведомление о событии, должен быть зарегистрирован отдельно. На практике большинство обработчиков событий представляет собой методы экземпляра, хотя это, конечно, зависит от конкретного приложения. Рассмотрим применение каждой из этих двух разновидностей методов в качестве обработчиков событий на конкретных примерах.

В приведенной ниже программе создается класс X, в котором метод экземпляра определяется в качестве обработчика событий. Это означает, что каждый объект класса X должен быть зарегистрирован отдельно, чтобы получать уведомления о событиях. Для демонстрации этого факта в данной программе производится групповая адресация события трем отдельным объектам класса X.

/* Уведомления о событиях получают отдельные объекты, когда метод экземпляра используется в качестве обработчика событий. */

using System;

// Объявить тип делегата для события,

delegate void MyEventHandler() ;

// Объявить класс, содержащий событие,

class MyEvent {

  public event MyEventHandler SomeEvent;

  // Этот метод вызывается для запуска события,

  public void OnSomeEvent() {

    if(SomeEvent != null)

      SomeEvent() ;

  }

}

class X {

  int id;

  public X(int x) {

    id = x;

  }

  // Этот метод экземпляра предназначен в качестве обработчика событий,

  public void Xhandler() {

    Console.WriteLine("Событие получено объектом " + id);

  }

}

class EventDemo3 {

  static void Main() {

    MyEvent evt = new MyEvent();

    X ol = new X(1);

    X o2 = new X(2);

    X o3 = new X(3);

    evt.SomeEvent += ol.Xhandler;

    evt.SomeEvent += o2.Xhandler;

    evt.SomeEvent += o3.Xhandler;

    // Запустить событие,

    evt.OnSomeEvent() ;

  }

}

Выполнение кода из этого примера приводит к следующему результату.

Событие получено объектом 1

Событие получено объектом 2

Событие получено объектом 3

Как следует из результата выполнения кода из приведенного выше примера, каждый объект должен зарегистрировать свой интерес в событии отдельно, и тогда он будет получать отдельное уведомление о событии.

С другой стороны, когда в качестве обработчика событий используется статический метод, события обрабатываются независимо от какого-либо объекта, как демонстрируется в приведенном ниже примере программы.

/* Уведомления о событии получает класс, когда статический метод используется в качестве обработчика событий. */

using System;

// Объявить тип делегата для события,

delegate void MyEventHandler();

// Объявить класс, содержащий событие,

class MyEvent {

  public event MyEventHandler SomeEvent;

  // Этот метод вызывается для запуска события,

  public void OnSomeEvent() {

    if (SomeEvent != null)

      SomeEvent() ;

  }

}

class X {

/* Этот статический метод предназначен в качестве обработчика событий. */

  public static void Xhandler() {

    Console.WriteLine("Событие получено классом.");

  }

}

class EventDemo4 {

  static void Main() {

    MyEvent evt = new MyEvent();

    evt.SomeEvent += X.Xhandler;

    // Запустить событие,

    evt.OnSomeEvent();

  }

}

При выполнение кода этого примера получается следующий результат.

Событие получено классом.

Обратите в данном примере внимание на то, что объекты класса X вообще не создаются. Но поскольку Xhandler() является статическим методом класса X, то он может быть привязан к событию SomeEvent и выполнен при вызове метода OnSomeEvent().

1 ... 129 130 131 132 133 134 135 136 137 ... 294
На этой странице вы можете бесплатно читать книгу C# 4.0: полное руководство - Герберт Шилдт бесплатно.
Похожие на C# 4.0: полное руководство - Герберт Шилдт книги

Оставить комментарий