. Стиллмен, Дж. Грин - Изучаем C#, 2-е издание
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
пр<strong>е</strong>дставл<strong>е</strong>ни<strong>е</strong> страницы событий<br />
Обобщ<strong>е</strong>нный EventHandler<br />
Посмотрим на объявл<strong>е</strong>ни<strong>е</strong> события в класс<strong>е</strong> Ball:<br />
p u b l i c e v e n t E v e n tH a n d le r B a l l l n P l a y ;<br />
A т <strong>е</strong> п <strong>е</strong> р ь р а с с м о т р и м о б ъ я в л <strong>е</strong> н и <strong>е</strong> с о б ы т и я C l i c k д л я к н о п к и ф о р м ы :<br />
p u b l i c e v e n t E v e n tH a n d le r Click;<br />
Они называются по-разному, но объявляются одним и т<strong>е</strong>м ж<strong>е</strong> способом. А так<br />
как вс<strong>е</strong> это пр<strong>е</strong>красно работа<strong>е</strong>т, постронни<strong>е</strong> могут и н<strong>е</strong> знать, что обработчик<br />
BallEventHandler п<strong>е</strong>р<strong>е</strong>да<strong>е</strong>т BallEventArgs при возникнов<strong>е</strong>нии события. К счастью,<br />
.NET им<strong>е</strong><strong>е</strong>тся инструм<strong>е</strong>нт, позволяющий л<strong>е</strong>гко сообщить эту информацию, —<br />
обобщ<strong>е</strong>нный EventHandler. Изм<strong>е</strong>нит<strong>е</strong> обработчик события BalllnPlay вот таким<br />
образом:<br />
Обобщ<strong>е</strong>нный<br />
аргум<strong>е</strong>нт<br />
EventHandler<br />
долж<strong>е</strong>н быть<br />
производным<br />
от EventArgs.<br />
public event EventHandler B^lInPlay;<br />
Вам понадобиться отр<strong>е</strong>дактировать и м<strong>е</strong>тод OnBalllnPlay, зам<strong>е</strong>нив EventHandler на Event-<br />
Handler. Но при попытк<strong>е</strong> построить код в окн<strong>е</strong> Error List появится сообщ<strong>е</strong>ни<strong>е</strong><br />
о двух ошибках:<br />
Error List П X "<br />
O 2 Errors i A 0 Warnings 1 0 Messages<br />
Description File Line Column ■<br />
Q 1<br />
O 2<br />
Cannot implicit^ convert type ‘System.EventHandler' to<br />
' System.EventHandlef < Baseball. Bat[Ever^tArgs>'<br />
Cannot implicitly convert type 'System.EventHandler' to<br />
'System.EventHandler< Baseball,BsllEventArgs>'<br />
Pitcher.cs 12 32 1<br />
Fan.cs 12 32 I<br />
Д<strong>е</strong>ло в том, что посл<strong>е</strong> изм<strong>е</strong>н<strong>е</strong>ний в объявл<strong>е</strong>нии события нужно обновить классы Pitcher и Fan, заставив<br />
их п<strong>е</strong>р<strong>е</strong>давать обработчику обобщ<strong>е</strong>нный аргум<strong>е</strong>нт:<br />
b a l l .B a l l l n P l a y += n e w E v e n tH a n d le r < B a llE v e n tA r g s > ( b a l l _ B a l l I n P l a y ) ;<br />
Н<strong>е</strong>яВно<strong>е</strong> пр<strong>е</strong>образовани<strong>е</strong><br />
Автоматич<strong>е</strong>ски созданный обработчик событий буд<strong>е</strong>т обязат<strong>е</strong>льно сод<strong>е</strong>ржать ключ<strong>е</strong>во<strong>е</strong> слово new, за<br />
которым сл<strong>е</strong>ду<strong>е</strong>т <strong>е</strong>го тип. Если ж<strong>е</strong> убрать это ключ<strong>е</strong>во<strong>е</strong> слово и тип обработчика, <strong>C#</strong> осущ<strong>е</strong>ствит н <strong>е</strong> я в <br />
н о <strong>е</strong> п р <strong>е</strong> о б р а з о в а н и <strong>е</strong> и опр<strong>е</strong>д<strong>е</strong>лит тип за вас:<br />
b a l l . B a l l l n P l a y += b a l 1 _ В а 1 1 I n P l a y ;<br />
Зам<strong>е</strong>нит<strong>е</strong> код в конструкторах классов Pitcher и Fan указанным выш<strong>е</strong> способом. Вы увидит<strong>е</strong>, что на<br />
работ<strong>е</strong> программы это н<strong>е</strong> отразится.<br />
506 глава 11