14.02.2017 Views

. Стиллмен, Дж. Грин - Изучаем C#, 2-е издание

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

оставьт<strong>е</strong> сообщ<strong>е</strong>ни<strong>е</strong>, я вам п<strong>е</strong>р<strong>е</strong>звоню<br />

Обратный Вызов как способ работы с д<strong>е</strong>л<strong>е</strong>гатами<br />

Обратный вызов явля<strong>е</strong>тся <strong>е</strong> щ <strong>е</strong> о д н и м с п о с о б о м р а б о т ы с д <strong>е</strong> л <strong>е</strong> г а т а м и .<br />

Он описыва<strong>е</strong>т ш а б л о н —способ, при котором вы использу<strong>е</strong>т<strong>е</strong> д<strong>е</strong>л<strong>е</strong>гатов<br />

в своих классах таким образом, что один объ<strong>е</strong>кт мож<strong>е</strong>т сообщить другому<br />

«Сообщи мн<strong>е</strong>, когда это случится!»<br />

®<br />

1 Г У ^ р а ^ <strong>е</strong> н и <strong>е</strong> !<br />

Добавим в про<strong>е</strong>кт <strong>е</strong>щ<strong>е</strong> один д<strong>е</strong>л<strong>е</strong>гат<br />

Так как объ<strong>е</strong>кт Bat хранит д<strong>е</strong>л<strong>е</strong>гата в закрытом пол<strong>е</strong>, указывающ<strong>е</strong>м на м<strong>е</strong>тод, новый д<strong>е</strong>л<strong>е</strong>гат долж<strong>е</strong>н<br />

им<strong>е</strong>ть совпадающую сигнатуру:<br />

Обратный вызов обь<strong>е</strong>кта Bat буд<strong>е</strong>т<br />

d e l e g a t e v o i d B a t C a l l b a c k ( B a l l E v e n t A r g s e) ; Указывать на м<strong>е</strong>тод OnBalllnPlayQ<br />

г. -у а о этого Объ<strong>е</strong>кта, поэтому д<strong>е</strong>л<strong>е</strong>гат об-<br />

Созааоать для д<strong>е</strong>л<strong>е</strong>гатов отд<strong>е</strong>льны<strong>е</strong> фай- / у ратного вызова долж<strong>е</strong>н им<strong>е</strong>ть аналы<br />

н<strong>е</strong>обязат<strong>е</strong>льно. Этот д<strong>е</strong>л<strong>е</strong>гат пом <strong>е</strong>- \ логичную сигнатуру — использовать<br />

стит<strong>е</strong> в файл с классом Bat.<br />

V___ в кач<strong>е</strong>ств<strong>е</strong> парам<strong>е</strong>тра BallEventArgs<br />

_ _<br />

Добавим к про<strong>е</strong>кту класс B a t<br />

н<strong>е</strong> возвращать знач<strong>е</strong>ния.<br />

Это оч<strong>е</strong>нь простой класс. Он сод<strong>е</strong>ржит м<strong>е</strong>тод HitTheBall (), запускающийся при каждом удар<strong>е</strong><br />

по мячу, который с помощью д<strong>е</strong>л<strong>е</strong>гата hitBallCallback () вызыва<strong>е</strong>т м<strong>е</strong>тод OnBalllnPlay ()<br />

(п<strong>е</strong>р<strong>е</strong>дава<strong>е</strong>мый в конструктор).<br />

c l a s s B a t {<br />

p r i v a t e B a t C a l l b a c k h i t B a l l C a l l b a c k ;<br />

Д ля пр<strong>е</strong>дот- p u b l i c B a t ( B a t C a l l b a c k c a l l b a c k D e l e g a t e ) {<br />

вращ<strong>е</strong>ния UC- t h i s . h i t B a l l C a l l b a c k = n e w B a t C a l l b a c k ( c a l l b a c k D e l e g a t e ) ;<br />

ключ<strong>е</strong>ния нужно }<br />

p u b l i c v o i d H i t T h e B a l l ( B a l l E v e n t A r g s e)<br />

ссыла<strong>е</strong>тся ли<br />

какой д<strong>е</strong>л<strong>е</strong>гат -----=> i f ( h i t B a l l C a l l b a c k != null)<br />

на знач<strong>е</strong>ни<strong>е</strong> null.<br />

h i t B a l l C a l l b a c k (<strong>е</strong>)<br />

©<br />

}<br />

Мы воспользовались оп<strong>е</strong>ратором =, так как в данном случа<strong>е</strong> нужно, чтобы объ<strong>е</strong>кт bat<br />

получал сообщ<strong>е</strong>ния только от одного объ<strong>е</strong>кта ball, соотв<strong>е</strong>тств<strong>е</strong>нно, данный д<strong>е</strong>л<strong>е</strong>гат<br />

настраива<strong>е</strong>тся вс<strong>е</strong>го один раз. Но ничто н<strong>е</strong> запр<strong>е</strong>ща<strong>е</strong>т написать обратный вызов с<br />

оп<strong>е</strong>ратором +=, который буд<strong>е</strong>т адр<strong>е</strong>сован н<strong>е</strong>скольким м<strong>е</strong>тодам. Основной смысл<br />

обратного вызова — в отсл<strong>е</strong>живании вызывающим объ<strong>е</strong>ктом адр<strong>е</strong>сатов. В случа<strong>е</strong><br />

события, объ<strong>е</strong>кты тр<strong>е</strong>буют опов<strong>е</strong>щ<strong>е</strong>ния, добавляя обработчики, в то вр<strong>е</strong>мя как при<br />

обратном вызов<strong>е</strong> объ<strong>е</strong>кты п<strong>е</strong>р<strong>е</strong>бирают д<strong>е</strong>л<strong>е</strong>гатов и просят об опов<strong>е</strong>щ<strong>е</strong>нии.<br />

Свяж<strong>е</strong>м биту с мячом<br />

Каким<br />

...........<br />

ж<strong>е</strong> образом<br />

гг__________<br />

конструктор объ<strong>е</strong>кта Bat получа<strong>е</strong>т ссылку на м<strong>е</strong>тод OnBalllnPlay () опр<strong>е</strong>д<strong>е</strong>л<strong>е</strong>нного<br />

мяча? Он вызыва<strong>е</strong>т м<strong>е</strong>тод GetNewBat {) (Получить новую биту) этого объ<strong>е</strong>кта, который мы<br />

с<strong>е</strong>йчас добавим:<br />

p u b l i c Bat G e t N e w B a t О<br />

{<br />

r e t u r n n e w B a t ( n e w B a t C a l l b a c k ( O n B a l l l n P l a y ) )<br />

) /<br />

<strong>е</strong>го 8 mL oS „л» мЗ “ / „ Г “<br />

518 глава 11<br />

М<strong>е</strong>тод QetNewBatÇ) созда<strong>е</strong>т<br />

объ<strong>е</strong>кт Bat и использу<strong>е</strong>т д<strong>е</strong>л<strong>е</strong>гат<br />

BatCallBack для п<strong>е</strong>р<strong>е</strong>дачи<br />

ссылки на этот новый объ<strong>е</strong>кт<br />

собств<strong>е</strong>нному м<strong>е</strong>тоду<br />

OnBallInPiayQ. Им<strong>е</strong>нно этот<br />

м<strong>е</strong>тод обратного вызова буд<strong>е</strong>т<br />

прим<strong>е</strong>н<strong>е</strong>н битой в мом<strong>е</strong>нт удара<br />

по мячу.

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

Saved successfully!

Ooh no, something went wrong!