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 />

Каж<strong>е</strong>тся, наш сч<strong>е</strong>тчик коров работа<strong>е</strong>т корр<strong>е</strong>ктно. Запустит<strong>е</strong> программу и щ<strong>е</strong>лкнит<strong>е</strong> на кнопк<strong>е</strong> для пров<strong>е</strong>рки.<br />

Сд<strong>е</strong>лайт<strong>е</strong> колич<strong>е</strong>ство коров равным 30 и снова щ<strong>е</strong>лкнит<strong>е</strong> на кнопк<strong>е</strong>. Повторит<strong>е</strong> эту оп<strong>е</strong>рацию<br />

для 5 коров, а потом для 20 коров. Вот что должно появиться в окн<strong>е</strong> Output:<br />

I need 450 bags of feed for is cows<br />

I need see bags of feed for 30 co»s<br />

I need 150 bags of feed for 5 cows<br />

I need 600 bags of feed for 20 cows<br />

Но <strong>е</strong>сть н<strong>е</strong>большая пробл<strong>е</strong>ма. Добавьт<strong>е</strong> к форм<strong>е</strong> кнопку, которая выполня<strong>е</strong>т оп<strong>е</strong>ратор:<br />

farmer.BagsOfFeed = 5;<br />

Вы понима<strong>е</strong>т<strong>е</strong>,<br />

поч<strong>е</strong>му это<br />

стало причиной<br />

ошибки?<br />

Запустит<strong>е</strong> программу. Вс<strong>е</strong> работа<strong>е</strong>т до нажатия новой кнопки. Попробуйт<strong>е</strong> посл<strong>е</strong> этого нажать кнопку<br />

Calculate. Окаж<strong>е</strong>тся, что 5 м<strong>е</strong>шков корма тр<strong>е</strong>бу<strong>е</strong>тся для любого колич<strong>е</strong>ства коров! Посл<strong>е</strong> р<strong>е</strong>дактирования<br />

парам<strong>е</strong>тра N u m ericU p D o w n кнопка Calculate снова начн<strong>е</strong>т работать корр<strong>е</strong>ктно.<br />

Полностью инкапсулиру<strong>е</strong>м класс Farmer<br />

Нап<strong>е</strong>чатав<br />

и дважды нажаЬ<br />

Пробл<strong>е</strong>ма в том, что класс н<strong>е</strong> полностью инкапсулирован. С помощью свойств мы tab, вы добавит<strong>е</strong><br />

инкапсулировали п<strong>е</strong>р<strong>е</strong>м<strong>е</strong>нную N u m berO fC ow s, но п<strong>е</strong>р<strong>е</strong>м<strong>е</strong>нная B a g s O f F e e d до сих пор к коду автоматич<strong>е</strong>ско<strong>е</strong><br />

свойство.<br />

общ<strong>е</strong>доступна. Это крайн<strong>е</strong> распростран<strong>е</strong>нная пробл<strong>е</strong>ма. Настолько распростран<strong>е</strong>нная,<br />

что в <strong>C#</strong> сущ<strong>е</strong>ству<strong>е</strong>т автоматич<strong>е</strong>ская проц<strong>е</strong>дура <strong>е</strong><strong>е</strong> р<strong>е</strong>ш<strong>е</strong>ния. Просто зам<strong>е</strong>нит<strong>е</strong> пол<strong>е</strong><br />

общ<strong>е</strong>го доступа B a g s O f F e e d автоматич<strong>е</strong>ским свойством. Вот как это сд<strong>е</strong>лать:<br />

/<br />

Удалит<strong>е</strong> пол<strong>е</strong> B a g s O f F e e d из класса F a rm er. Вм<strong>е</strong>сто н<strong>е</strong>го вв<strong>е</strong>дит<strong>е</strong> prop и дважды нажмит<strong>е</strong><br />

tab. Появится сл<strong>е</strong>дующая строка кода:<br />

о<br />

public[xnt] МуProperty { get; set; }<br />

Снова нажмит<strong>е</strong> tab, чтобы выд<strong>е</strong>лить пол<strong>е</strong> M y P r o p e r ty . Вв<strong>е</strong>дит<strong>е</strong> имя B a g sO fF e e d :<br />

public int BagsOfFeed { get; set; }<br />

о<br />

Т<strong>е</strong>п<strong>е</strong>рь у вас свойство вм<strong>е</strong>сто поля. Компилятор обрабатыва<strong>е</strong>т эту информацию, как вспомогат<strong>е</strong>льно<strong>е</strong><br />

пол<strong>е</strong>.<br />

Впроч<strong>е</strong>м пробл<strong>е</strong>ма <strong>е</strong>щ<strong>е</strong> н<strong>е</strong> р<strong>е</strong>ш<strong>е</strong>на. Для <strong>е</strong><strong>е</strong> р<strong>е</strong>ш<strong>е</strong>ния сд<strong>е</strong>лайт<strong>е</strong> свойство доступным только<br />

для чт<strong>е</strong>ния:<br />

public int BagsOfFeed { get; private set; }<br />

При попытк<strong>е</strong> построить код вы получит<strong>е</strong> сообщ<strong>е</strong>ни<strong>е</strong> об ошибк<strong>е</strong> в строчк<strong>е</strong>, задающ<strong>е</strong>й<br />

свойство B a g s O f F e e d , —м<strong>е</strong>тод записи н<strong>е</strong>доступ<strong>е</strong>н. В<strong>е</strong>дь вы н<strong>е</strong> мож<strong>е</strong>т<strong>е</strong> р<strong>е</strong>дактировать<br />

свойство B a g s O f F e e d вн<strong>е</strong> класса F a rm e r. Удалит<strong>е</strong> строчку кода, соотв<strong>е</strong>тствующую второй<br />

кнопк<strong>е</strong>. Т<strong>е</strong>п<strong>е</strong>рь класс F a r m e r хорошо инкапсулирован!<br />

дальш<strong>е</strong> ► 221

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

Saved successfully!

Ooh no, something went wrong!