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

 

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

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

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

Как мы помним, класс Саг (а точнее, его метод Car. SpeedUp{)) в его текущем состоянии приводит к исключению при попытке увеличить скорость уже вышедшего из строя автомобиля. Однако исключение — это очень сильное средство (если оно не перехватывается должным образом, выполнение программы будет прервано), и если есть возможность обойтись без исключения, лучше попробовать поступить именно так. Правильнее в этой ситуации будет использовать вместо исключения
пользовательское событие, возникающее при переходе автомобиля в нерабочее
состояние.
Мы изменим наш класс Саг, добавив в него два события. Первое событие (AboutToBl ow) будет происходить тогда, когда текущая скорость всего на 10 миль в час меньше максимально допустимой. Второе событие (Exploded) будет возникать тогда, когда пользователь пытается ускорить автомобиль, который уже вышел из строя. Создание любого события в С# состоит из двух этапов. Первый этап -создание делегата, который будет использован для вызова нужного нам метода при: срабатывании события, а второй этап - определение собственно события при по мощи ключевого слова event. Новый вариант класса Саг может выглядеть следующим образом:
Этот класс Саг будет посылать сообщени» о своей состоянии
puolic class car
(
// Пеоеґіенная для хранения о состоянии нашими
private bool dead:
Делегат. Он нужен, чтобы вызвать функцию или функции при возникновении // события
public delegate void EngineHandlertstring msg):
246 Глава 5 • Дополнительные возможности классов С#
Два события public static event EngineHandler Exploded; public static event EngineHandler AboutToBlow;
І"
Организовать срабатывание события (то есть организовать отправку этого события тому, кто ожидает его возникновения) очень просто — достаточно указать имя события и все необходимые параметры, которые требует соответствующий делегат. Например, новый вариант метода Speedupf), в котором логика работы с исключениями заменена на логику вызова события, может выглядеть так:
// Вызываем нужное событие а эаивисимосги от состояния объекта Саг public void SpeedUpdrrt delta)
{ Il Если автомобиль уже вышел из строя, генерируем событие Exploded
if(dead)
{
і ftExploded != null)
ExplodedC-Sorry. this car is dead..,"):
}
else
{
currSpeed+= delta;
//Приближаемся к опасной черте? Генерируем событае AboutToBlow
if(10 = - №<Speed - currSpeed) if(AboutToBlow I- null)
AboutToBlowi "Careful. approaching terminal
// Все нормально! Работаем как обычно if(crrSpeed >= maxSpeed) dead = true;
else
Console.WriteLi ne("\tCurrSpeed
}
J
Теперь мы настроили класс Car таким образом, чтобы при соответствующих условиях генерировались два события. Применение нового класса мы рассмотрим чуть позже — сразу же после того, как обсудим архитектуру модели событий чуть
более подробно.
Как работают события
Любое событие — это на самом деле набор двух скрытых методов, определенных как i с. Один из методов начинается с приставки add_, а второй — с приставки refnove_. Например, событие Exploded отображается в следующие методы:
// Это событие отображается в скрытые методы * // add_Exploded() и // remove_Exploded() //
public static event EngineHandler Exploded:
Помимо скрытых методов acid XXXX(I и renoveJCXXXO, каждому событию также соответствует статический класс, определенный как private. Его назначение —
currSpeed);
События 247
привязывать событие к соответствующему делегату. При этом при срабатынашш события будет вызван каждый из методов делегата. Такой способ позволяет сразу нескольким «приемникам событий» (event sinks) получать одно-единственное происшедшее событие.
Увидеть, что на самом деле кроется за нашими событиями, можно на рис. 5.8,
" D:\C5harpBoDk\Labs\Chdpter 5\tar?veits\Jb1tf\
ViSv.. Help
DACSharpBook1LabsKhapter5\CarEvents\binCiebug\Car?ventsB
1-І
> MANIFEST V CarEvents в Щ Саг
¦ class public auto ansiSeforefieWin« ! EngineHandler
i- AaoufTcBlcw: private static class CarEvents СагШпдіг * Exploded : private static class CarEvents. Car/EngineH: v currSpeed : private Int32 ¦., da ad : private bool
maxSpeed : private inl32 -¦ V petName: private string 4/ theMusicBox private class CarEvents.CarfRadio -¦ .ctor: voldO
. ¦ .ctor: vold(string,lnt32,lnt32)
¦ CrankTunes :vold(bool)
¦ Speedup :void(int32)
Q add_AbouHaBlow:void(class CarEvents.CatfEnglneH
:
U femov8_ADouiTo0low: voidfcJass CarEvents С a-C:1?' . U rerrsove_Exploded :vaid(class CarEvents.CarfEngineH— . f AboutToBlaw: CarEvents.CarfEnglneHandler V Exploded: CarEvents.CarfEngineHandler
I >
CarEvents
Рис. 5.8. События C#
и то, что им соответствует
Таким образом, любое событие (в нашем случае событий два - Expl oded и About внутренне представляется следующими членами:
• статическим классом, определенным как pri vate;
• методом _ХXXX();
• методомгеточе_ХХХХ().
Если мы захотим посмотреть, какие инструкции промежуточного языка кроются за методом add_AboutToBlow, то обнаружим следующий код (обратите внимание на вызов метода
.method public hidebysig specialname static
Предыдущая << 1 .. 98 99 100 101 102 103 < 104 > 105 106 107 108 109 110 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100