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>ктирования<br />

_<br />

Часто<br />

д а Д а Б а <strong>е</strong> М ы <strong>е</strong><br />

Bollj=»oCbi<br />

Ч<strong>е</strong>м обратный вызов отлича<strong>е</strong>тся от события?<br />

! События и д<strong>е</strong>л<strong>е</strong>гаты — это часть .NET. Это способ, которым<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><br />

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

Обратны<strong>е</strong> вызовы н<strong>е</strong> принадл<strong>е</strong>жат .NET — это вс<strong>е</strong>го лишь названи<strong>е</strong><br />

способа использования д<strong>е</strong>л<strong>е</strong>гатов (или событий, ничто<br />

н<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> событий объ<strong>е</strong>кты тр<strong>е</strong>буют опов<strong>е</strong>щ<strong>е</strong>ний.<br />

То <strong>е</strong>сть обратны<strong>е</strong> вызовы н<strong>е</strong> принадл<strong>е</strong>жат .NET?<br />

Q ; Н<strong>е</strong>т. Обратный вызов — это шаблон, способ использования<br />

сущ<strong>е</strong>ствующих типов, ключ<strong>е</strong>вых слов и инструм<strong>е</strong>нтов. Рассмотрит<strong>е</strong><br />

внимат<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 />

являются типом .NET<br />

Получа<strong>е</strong>тся, что обратны<strong>е</strong> вызовы — это вс<strong>е</strong>го лишь<br />

закрыты<strong>е</strong> события?<br />

Q ; Н<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>т модификатор доступа p r i v a t e ? Доступ<br />

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

класса. Поэтому, пом<strong>е</strong>тив событи<strong>е</strong> как p r iv a t e , вы запр<strong>е</strong>ща<strong>е</strong>т<strong>е</strong><br />

подписываться на н<strong>е</strong>го из других классов. В то вр<strong>е</strong>мя как<br />

обратны<strong>е</strong> вызовы допускают анонимную подписку.<br />

Но обратный вызов выглядит как событи<strong>е</strong>, н<strong>е</strong> снабж<strong>е</strong>нно<strong>е</strong><br />

ключ<strong>е</strong>вым словом event.<br />

Q l Обратный вызов похож на событи<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>тод.<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>ствляющий<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><br />

пробл<strong>е</strong>мы, с которыми вы мож<strong>е</strong>т<strong>е</strong> столкнуться, уж<strong>е</strong> р<strong>е</strong>ш<strong>е</strong>ны,<br />

и вам достаточно воспользоваться подходящим патт<strong>е</strong>рном.<br />

520 глава 11

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

Saved successfully!

Ooh no, something went wrong!