Событие получено объектом класса 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().
Дата добавления: 2019-02-12; просмотров: 290; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!