Добавил:
2200 7008 9480 6099 TKFF БЛАГОДАРНОСТЬ МОЖНО ТУТ ОСТАВИТЬ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДИПЛОМ 2025 / 4 курса_МТУСИ / 1 КУРС / Информатика / С# для чайников - Мюллер.pdf
Скачиваний:
0
Добавлен:
04.06.2025
Размер:
53.3 Mб
Скачать

на то, что приведенная демонстрационная программа не будет ком­ пилироваться - при такой попытке вы получите сообщение о том,

что обращение к члену DouЬleBankAccount . BankAccount . _balance

невозможно:

С шимго p((р

й

йгошимp((р й

й 'шrшим(, т : :имш((,

: ,

,

,

р:

тхр

,( :римr, ,r ,

 

Трудно сказать, зачем компилятор заставили выводить такие скучные сооб­ щения вместо короткого "не лезь к private", но суть именно в этом. Выраже­ ние Ьа . _balance += 1 0 ; оказывается некорректным именно по этой причине - в силу объявления _balance как private этот член недоступен методу Main ( ) , расположенному вне класса BankAccount. Замена данного выражения выра­ жением Ьа . Deposit ( 1 0 ) решает возникшую проблему - метод BankAccount . Deposit ( ) объявлен как puЫic, а потому доступен для метода Main ( ) .

Тип доступа по умолчанию - private, так что если вы забыли или сознательно пропустили модификатор для некоторого члена, это ана­ логично тому, как если бы вы описали его как private. Однако на­

ЗАПОМНИ! стоятельно рекомендуется всегда использовать это ключевое слово явно во избежание любых недоразумений. Хороший программист всегда явно указывает свои намерения, что является еще одним ме­ тодом снижения количества возможных ошибок .

Прочие уровни безопасности

Вэтом разделе используются определенные знания о наследовании

ипространствах имен, которые будут рассмотрены в более поздних

главах книги (глава 16, "Наследование", и 20, "Пространства имен и ВНИМАНИВ библиотеки"). Вы можете пропустить этот раздел и вернуться к нему

позже, получив необходимые знания. Язык С# предоставляет следу­ ющие уровни безопасности.

>>Члены, объявленные как puЫ i c, доступны любому классу про­ граммы.

»Члены, объявленные как private, доступны только из текущего класса.

»Члены, объявленные как protected, доступны только из текущего класса и всех его подклассов.

»Члены, объявленные как internal, доступны для любого класса в

,том же модуле программы.

Модулем (module), или сборкой (assemЬly), в С# называется отдель­ но компилируемая часть кода, представляющая собой выполнимую

ГЛАВА 1 5 Класс: каждый сам за себя aоsи

. ЕХЕ-программу либо библиотеку . DLL. Одно пространство имен может распространяться на несколько модулей. (В главе 20, "Про­ странства имен и библиотеки'; рассматриваются сборки и простран­ ства имен С# и обсуждаются уровни доступа, отличные от puЫic и private.)

»Члены, объявленные как internal protected, доступны для теку­ щего класса и всех его подклассов, а также классов в том же модуле программы.

Сокрытие членов путем объявления их как private обеспечивает макси­ мальную степень безопасности. Однако зачастую такая высокая степень и не нужна. В конце концов, члены подклассов и так зависят от членов базового класса, так что ключевое слово protected предоставляет достаточно удобный уровень безопасности.

Зачем нужно управление. оступом

Объявление внутренних членов класса как puЫic - не лучшая мысль как минимум по следующим причинам.

»Объявляя члены-данные puЫic, вы не в состоянии просто определить, когда и как они модифицируются. Зачем беспоко­

иться и создавать методы Deposit ( ) и Withdraw ( ) с проверками корректности? И вообще, зачем создавать любые методы, ведь лю­ бой метод любого класса может модифицировать данные счета в любой момент. Но если другой метод может обращаться к этим дан­ ным, то он практически обязательно это сделает.

Ваша программа BankAccount может проработать длительное вре­ мя, прежде чем вы заметите, что баланс одного из счетов отрицате­ лен. Метод Withdraw ( ) призван оградить от подобной ситуации, но в описанном случае непосредственный доступ к балансу, минуя ме­ тод Withdraw ( ) , имеют и другие методы. Вычислить, какие именно методы и при каких условиях поступают так некорректно, - задача не из легких.

»Доступ ко всем членам-данным класса делает его интерфейс слишком сложным. Как программист, использующий класс Bank

Account, вы не хотите знать о том, что делается внутри него. Вам до­ статочно знаний о том, как положить деньги на счет и снять их с него.

)) Доступ ко всем членам-данным класса приводит к "растека­ нию" правил класса. Например, класс BankAccount не позво­ ляет балансу стать отрицательным ни при каких условиях. Это -

328 ЧАСТЬ 2 Объектно-ориентирован ное программирование на С#

бизнес-правило, которое должно быть локализовано в методе Withdraw ( ) . В противном случае вам придется добавлять соответ­ ствующую проверку в весь код, в котором осуществляется измене­ ние баланса.

 

Что произойдет, если банк решит изменить правила и часть клиен­

 

тов с хорошей кредитной историей получит право на небольшой

 

отрицательный баланс в течение короткого времени? Вам придется

 

долго рыскать по всей программе и вносить изменения во все ме­

 

ста, где выполняется непосредственное обращение к балансу.

 

tу дукиkвуакиллп е нуводп зокуу долвблрпне. )ун rво руозeодее

 

нооювору иисироедикЬрия зояор0 eиаусомч rво лсолво лонойув

 

мин лреоевЬаокенулвмооаезоа маодуtбо моонойролвееллокЬобkву

СОВЕТ

нодемеаивос private, и оивунисе руозeоденолве лодрениkву уродо

 

protected, internal, internal protected И Л И puЫic.

Методы доступа

ь-. C -0 2!.00 -)C-(,0.

)! .!--!,,C,0

)(

<.(-- BankAccount, во бмедее

 

ву рулаокЬаодсбреe нуводомеддер ео реeц GetString ( ) , моомси.иув лвсо(

 

аомбт муслет

лнуви дкя мпмоди уу ри rасир иолсудлвмонмпоомиConsole .

 

WriteLine ( ) . Cуко мвонД)во мпмодлодусйеноh озеуави BankAccount нойуь

 

зпв0 оивсбдрурДулке rволодусйеноу рудолвбирояо вонб йуцлкудбялсеррелб

 

aовдиkвуаулирт аулисумо<.акиллдо уренув0 лсимолин суаив0. тиа ор збдув

 

лсудлвимкур лсе мпмодуt

 

 

 

 

 

 

ос ону вороценуувля дминуводи дкя pгщiинжСP ежПинжСP GetBalance ( ) е

 

GetAccountNumЬer ( ) , е нувод i2оПжгжыС ежПинжаP - SetAccountNumЬer ( ) .

 

хп нойуву бдемев0лягои)ун виа мокромив0ляеохоивороц)во )к ур ­ balance

 

збдув озеямкур аиа private, е лсе rвон лсудолвимкяв0нувод GetBalance ( ) ?

 

dи линон дуку дкя rво

енутвля.

долвивонромулаеу олромиреяC

 

 

»

ччиth-hlРч.

 

­Ч.не дает возможности изменять член

ц ц

д

 

он только возвращает его значение. Тем самым значение баланса

 

 

делается доступным только для чтения. Используя аналогию с на­

 

 

стоящим банком, вы можете просмотреть состояние своего счета в

 

 

любой момент, но не можете снять с него деньги иначе, чем с приме­

 

»

нением процедур,

предусмотренных для этого банком.

 

 

Метод д

ц

ц скрываетд

внутренний формат класса от

 

 

внешних методов. Метод GetBalance ( ) может в процессе работы

 

 

выполнять некоторые вычисления, обращаться к базе данных бан­

 

 

ка - словом, выполнять какие-то действия, чтобы получить состо­

 

 

яние счета. Внешние методы ничего об этом не знают и не должны

 

 

знать. Продолжая аналогию, вы интересуетесь состоянием счета, но

 

 

не знаете,

как, где и в каком именно виде хранятся ваши деньги.

 

ГЛАВА 1 5 Класс: каждый сам за себя иоС.

Пример управления доступом

 

Д..........

 

..3..

.........

......

...1.....

 

 

 

...7.g

....

.....4.....L.

 

..

 

.L ...

.....

......1.

 

.......

.. ..

.. .....

щ

.7.

..

П....

.........5..

.........

.....

...1.....

 

Ф

Ф

 

 

Ф .

 

.

.

Ф

.

Ф

 

 

 

Ф .

 

.

Ф

 

 

Ф .

.

Ф

Ф.

 

.

Ф

 

 

Ф .

Ф

.

 

 

б .

 

.

.

 

.

Ф

 

 

ЧАСТЬ 2 рeеtиосор оерtсореi.,ссioi oеiде,яя реi. ,срoi эЬ С#

Метод знбла рсоздает банковский счет и вносит на него сумму 1 23,454, т.е. сумму с дробным количеством копеек. Затем метод знела рвносит на счет еще одну долю копейки и выводит баланс счета. Вывод программы выглядит сле­ дующим образом:

ыИ

ен а

ы И

ыД

ен а

ы И

Г И Д

Пользователь начинает жаловаться на некорректные расчеты. Похоже, в программе имеется ошибка.

Проблема, конечно, в том, что 5аш и5l5 выводится как 5аш75lшЧтобы избе­ жать проблем, банк принимает решение округлять вклады и снятия до ближай­ шей копейки. Простейший путь осуществить Клаф, конвертировать счета в аопетнви использовать метод попбтнСшоомлаа 2какн Клафсделано в демонстра­ ционной программе попетнвбнлИппомлАш

 

1

ог

И

ен

И

ен

Д

гк

И

Д

Дк

к т

 

т 5

 

т

 

т г

 

о г

 

к з

 

 

 

 

Д

 

 

 

щ т

 

т ,

г

г

 

 

 

к т

ен

о шД

о г

ко

 

И

 

 

о у

г

 

 

г

 

ГЛАВА 1 5 Класс: каждый сам за себя

1

33

ГЛАВА 1 5 Класс: каждый сам за себя бббt

Соседние файлы в папке Информатика