Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 106

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 320 >> Следующая

}
II Второй приемник события Exploded public static void OnBlowllp2(str1ng s) {
Console.Writetine("> AGAIN I say: s):
I
it Приемник для события AbqutToBlow public static void QnAboutToBlow(string s) {
Console.Write, ins! "Message from car- fe}\ s):
)
Car.AboutToBlow
new Car,EngineHandler(OnAboutToBlow):
II Первый приемник события Exploded public static void OnBl owltp( string s)
События 251
—> CurrSpeed = Зо
— > Curl-Speed = 50 —> CurrSpeed = 70
Message fron car: Careful. appruachiny terminal speedt --> CurrSpeed = 90
Message from car: Sorry, this car is dead. . .
— XlGflIN I say: Sorry, this car is dead... Message frori car: Sorry, this car is dead-
— >f)GRIN I say: Sorry, this car is dead... Message from car: Sorry, this car is dead-
— »HillIM I say: Sorry, this car is dead.-
Messaae fI1DiQ car: Sorry, this car is dead___
— >ACfllN I say: Sorry, this car la dead — Message frun car: Sorry, this car is dead. , .
— »1(JhTN I say: Sorry, this car is dead... Press any key to continue
EIE
Рис. 5.10. Работа с несколькими приемниками единственного события
Теперь при возникновении события Exploded связанный с этим событием делегат вызовет и метод OnBI OwUpC), и метод DnB I owUp(). Убедиться в этом можно, посмотрев на рис. 5.10.
Объекты как приемники событий
К этому моменту мы выяснили, как создавать объекты, участвующие в диусі орон них взаимодействиях при помощи делегатов и событий, В приведенных выше примерах методы, работающие в качестве приемников событий, были помещены не посредственно в класс СагАрр вместе с другим содержимым. Однако с точки зрения инкапсуляции и более четкой организации есть смысл создать вспомогательный класс, в котором будут находиться только методы-приемники событий. Такой класс: может выглядеть следующим образом:
// Служебный класс для приемников событий public class CarEventStik
{
Il Приемник OnBlowUp для события Exploded
public void OnBIowUpCstring s)
{
Console.WritetineC"Message from car: {0}". s);
// Приемник QnBlowUp2 для того же события
public void 0nBlowUp2(string s)
{
Console.Wntetine(""->AGAIN I say: (D}". s);
// Приемник OnAboutFuBlow для события AbojtToBlow public void OnAboutToBlowCstring s)
* Console. Wn teL і net "Message from car: (0}". s):
!
Такая организация, при которой методы-приемники событий удалены из СагАрр представляется более аккуратной. Работа с этими приемниками будет производиться через отдельный объект класса CarEventSink:
252 Глава 5 • Дополнительные возможности классов
Обрат/те внимание на создание соьекта CarEventSink и его использование public class CarApp {
public static int Main(string[] args) (
Car cl - new CarCSlugBug", 100. 10);
Il Создаем объект с приемниками CarEventSink sink = new CarEventSinkO;
И Устанавливаем приемники
Car.Exploded +- new Car.EngineHandler(sink.OnBlowUp); Car.Exploded +- new Car.EngineHandleKslnk-OrtBlowUp?); Car.AboutToBlow+- new Car.EngineHandler(sink.OnAboutToBlow);
fordnt 1 - О; і < 10; і++) cl.SpeedUp(20);
It Отключаем приемники событий Car.Exploded -= new Car.EngineHandler(slnk.OnBlowUp): Car.Exploded -= new Car.EngineHandler(s1nk.0nBlowUp2): Car.AboutToBlow -- new Car.EngineHandler(sink.OnAboutToBlow);
return 0;
)
}
Результат работы этой программы будет тем же, что и на рис. 10. Код приложения CarEvents можно найти в подкаталоге Chapter 5.
Реализация обработки событий с использованием интерфейсов
Программистам СОМ хорошо знакома концепция интерфейсов обратного вызова (callback interfaces). Это средство позволяет клиенту СОМ получать события от соклассапри помощи пользовательского интерфейса СОМ. Преимущество такого подхода заключается в том, что ресурсов расходуется меньше, чем при использовании официально рекомендованной в СОМ архитектуры точки стыковки. Те же самые интерфейсы обратного вызова можно использовать и в С# (и во всей .NET). Материал этого раздела в дополнение к уже освоенному открывает перед нами другие возможности и подтверждает представления о том, что любую проблему можно решить несколькими разными способами.
Реализовывать интерфейс обратного вызова мы будем на примере все того же
класса Саг. Пусть условия останутся прежними — этот класс должен как-то передать сообщения внешнему миру при наступлении двух событий: когда автомобиль должен вот-вот развалиться (его скорость всего на 10 миль в час меньше максимально допустимой) и когда это печальное событие уже произошло. Однако сейчас мы не будем использовать ни делегат, ни событие. Вместо этого мы создадим
следующий пользовательский интерфейс:
// Интерфейс для работы с событиями public interface IEng1neEvents {
void AboutToBlowCstring msg):
События 253
void Exploded(string msg);
}
Если у нас есть интерфейс, то должен быть и класс, который его реализует. Далее мы создадим объект этого класса, и методам этого объекта и будет передавать вызовы автомобиль (объект класса Саг) при наступлении событий. А класс, реали-зующийинтерфейс1ЕпЕІпеЕуепІ8,можетвьіглядетьследующимобразом:
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100