14.02.2017 Views

. Стиллмен, Дж. Грин - Изучаем 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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!