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.

обратный вызов<br />

Обратный Вызов<br />

События в сист<strong>е</strong>м<strong>е</strong> работают корр<strong>е</strong>ктно, <strong>е</strong>сли объ<strong>е</strong>кты Ball и Bat им<strong>е</strong>ются в <strong>е</strong>динств<strong>е</strong>нном числ<strong>е</strong>. В ситуации,<br />

когда мяч<strong>е</strong>й больш<strong>е</strong> одного, вс<strong>е</strong> они оказываются подписаны на событи<strong>е</strong> HitTheBall и при <strong>е</strong>го<br />

возникнов<strong>е</strong>нии вбрасываются в игру, что н<strong>е</strong> им<strong>е</strong><strong>е</strong>т никакого смысла. Другими словами, нам нужно связать<br />

с битой вс<strong>е</strong>го один мяч, исключив возможность привязки других мяч<strong>е</strong>й.<br />

в этом нам помож<strong>е</strong>т о б р а т н ы й в ы з о в (c a llb a c k ). Так называ<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> аргум<strong>е</strong>нта. Обратный вызов позволит<br />

нам гарантировать, что объ<strong>е</strong>кт Bat опов<strong>е</strong>ща<strong>е</strong>т вс<strong>е</strong>го один объ<strong>е</strong>кт Ball:<br />

О Объ<strong>е</strong>кт B a t сохраня<strong>е</strong>т пол<strong>е</strong> д<strong>е</strong>л<strong>е</strong>гата закрытым<br />

Пр<strong>е</strong>дотвратить возможность создания ц<strong>е</strong>поч<strong>е</strong>к из объ<strong>е</strong>ктов Ball помож<strong>е</strong>т закрыти<strong>е</strong> хранящ<strong>е</strong>го<br />

эту информацию поля. В этом случа<strong>е</strong> объ<strong>е</strong>кт Bat управля<strong>е</strong>т вызовом нужного м<strong>е</strong>тода<br />

объ<strong>е</strong>кта Ball.<br />

О<br />

О<br />

Конструктор объ<strong>е</strong>кта B a t<br />

Когда мяч оказыва<strong>е</strong>тся в игр<strong>е</strong>, конструктор созда<strong>е</strong>т экз<strong>е</strong>мпляр биты и п<strong>е</strong>р<strong>е</strong>да<strong>е</strong>т указат<strong>е</strong>ль<br />

на н<strong>е</strong>го м<strong>е</strong>тоду OnBalllnPlay ( ). Это м <strong>е</strong> т о д о б р а т н о г о в ы з о в а , так как объ<strong>е</strong>кт Bat использу<strong>е</strong>т<br />

<strong>е</strong>го для вызовы объ<strong>е</strong>кта, который <strong>е</strong>го создал.<br />

Объ<strong>е</strong>кт Ball п<strong>е</strong>р<strong>е</strong>да<strong>е</strong>т<br />

сш лку на д<strong>е</strong>л<strong>е</strong>гат сво<strong>е</strong>-<br />

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

ОпВаІІІпРІауО в конструк-<br />

1 \^ ^ тор<strong>е</strong> объ<strong>е</strong>кта Bat. Посл<strong>е</strong>дний<br />

сохраня<strong>е</strong>т данный<br />

д<strong>е</strong>л<strong>е</strong>гат в закрытом пол<strong>е</strong><br />

hitriaeBallCallback.<br />

Когдо Bat ударя<strong>е</strong>т по мячу, он использу<strong>е</strong>т м<strong>е</strong>тод обратного вызова<br />

Но пока Bat скрыва<strong>е</strong>т д<strong>е</strong>л<strong>е</strong>гат, можно быть полностью ув<strong>е</strong>р<strong>е</strong>нным в том, что ни<br />

один другой мяч в игру н<strong>е</strong> попад<strong>е</strong>т. Вот р<strong>е</strong>ш<strong>е</strong>ни<strong>е</strong> пробл<strong>е</strong>мі.]!<br />

Други<strong>е</strong> мячи н<strong>е</strong> могут<br />

подсо<strong>е</strong>диниться к эт о­<br />

му д<strong>е</strong>л<strong>е</strong>гату, так как<br />

данно<strong>е</strong> пол<strong>е</strong> объ<strong>е</strong>кта<br />

Bat закрыто.<br />

-Г hitBalICalIback<br />

t<br />

Т<strong>е</strong>п<strong>е</strong>рь<br />

объ<strong>е</strong>кт<br />

Bat мож<strong>е</strong>т вызвать<br />

д<strong>е</strong>л<strong>е</strong>гат<br />

hitBallCallhackj который,<br />

в свою оч<strong>е</strong>р<strong>е</strong>дь,<br />

вызов<strong>е</strong>т м <strong>е</strong> ­<br />

тод OnBallInPiayQ<br />

объ<strong>е</strong>кта Ball.<br />

516 глава 11

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

Saved successfully!

Ooh no, something went wrong!