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

static void Main (string [ ] args)

{

// Создание объекта DoMath DoMath rnath = new DoMath ( ) ;

// Тестирование функций

2

DoMath

 

2 ) ) ;

Console . WriteLine ( " б +

ч л г е а trnath. DoAdd ( б,

Console . WriteLine ( " б - 2

{ О } " ,

rnath . DoSuЬ ( б,

2 ) ) ;

Console .WriteLine ( " б

* 2

{ О } " ,

rnath. DoMul ( б,

2 ) ) ;

Console . WriteLine ( " б

/

2

ж л со а trnath. DoDiv ( б ,

2 ) ) ;

// Ожидаем подтверждения пользователя

Console . WriteLine ( "Haжмитe <Enter> для " +

Console . Read ( ) ;

"завершения программы. . . " ) ;

Вот вывод нашего тестового приложения:

6

+

2

=

8

)

­

и =

 

 

 

 

=

 

б

/

2

=

3

Нажмите

<Enter> для завершения программы. . .

Библиотеки зачастую предоставляют только статические методы. В этом случае инстанцировать библиотечный объект не нужно -

можно просто вызвать метод с помощью класса.

СОВЕТ

Дополнительные ключевые слова для управления доступом

Разделение программ на несколько сборок, как говорилось в предыдущих разделах, приводит к вопросу, какой код в AssemЬlyB доступен для обращения коду из AssemЬlyA. Примеры из главы 1 5, "Класс: каждый сам за себя", хорошо иллюстрируют применение ключевых слов puЫic и private. Но в этой главе я ничего не рассказал вам о других ключевых словах, управляющих доступом: protected, internal и комбинации protected internal. В следующих разде­ лах эта ситуация будет исправлена в предположении, что вы понимаете, что такое наследование и перекрытие методов, а также ключевого слова puЫic и private. Чтобы этот раздел имел для вас смысл, возможно, вам следует прочи­ тать (или перечитать) главу 1 5, "Класс: каждый сам за себя".

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

Предположим, у нас есть программа с двумя проектами.

»Первый проект - выполнимая программа InternalLimitsAccess, класс которой Congress содержит метод Main ( ) , выполняющий программу (нет такого закона, чтобы класс метода Main ( ) обяза­ тельно назывался "Program").

»Второй проект - библиотека классов CIMssemЫy.

Вреальности Конгресс имеет раздражающую привычку лезть в дела ЦРУ

итребовать от него отчета и рассказа о своих секретах - понятно, только для конгрессменов и сенаторов. "Мы никому ничего не расскажем!" Подозритель­ ные же шпионы из ЦРУ боятся делиться своими секретами (наверняка они знают, из чего сделана кока-кола!) Допустим, что ЦРУ хотят сохранить свой самый главный секрет в полной тайне.

И тут начинаются проблемы. Все в ЦРУ должны знать этот секрет. В приме­ ре InternalLimitsAccess ЦРУ разделено на несколько классов, скажем, клас­ сы GroupA и GroupB. Представим, что это подразделения ЦРУ, которые иногда делятся секретами друг с другом. Предположим, что GroupA хранит некото­

рый страшный секрет Х, помеченный как private (гриф "Перед прочтением сжечь!"). Код имеет примерно следующий вид:

цц

 

a кт ,щктшrг:г :

r((,

р

 

 

(xш

срк1щ,

 

 

 

 

 

 

 

 

:(ш

р:,

"ш:к нт n ,т

 

 

 

 

 

 

 

 

 

 

цц

 

 

 

 

 

 

 

цц

:(

сЕrr

 

p

 

 

 

т

(rш

Cщр

тr

 

 

 

 

 

тх:

ш ,

 

щ1 :ктжми

,(щ:рщг,

rш:рщср(шсратшИцц

ы V

 

:кт

,щкшCsщр тrн ,

,(э,

:рщг rшрщср:

(шсрrш. ы

т

:(

(uш

Cщр

тдд

 

 

 

 

 

т

D(

р:,

"р6рг,

3:к1e: 36,(щ, gн ,

 

 

 

 

цц

 

 

 

6,(щ,

:

 

 

ГЛАВА 20 Пространства имен и библиотеки 465

t !R!!,;AEj !! ,;!,;!!,R!p nr !d!!,; D!ER!!!! !!!!! Ал iWиn,;!eА

!!!!!!! !!!! ,! !!!!A !! E! Оt tm !! !!W ! Оnt iWde !!! !!d!i

 

,;!,;AD!!!!

иЗtОо! !D!

р d!,;!! ! m,;e! !! !!d!!

!B!!!

D!!!!!y

ЗАПОМНИ!

D!ER!!!d

!!!!!d

iWи

eА,;! !

!!!о d!o,,; !!!,R !,;A!!!,;,! D

 

 

 

 

 

 

 

 

!! D!!

oi!d !,;!,;Ad!E!!

D!D!!d

!!D!!,;j !! !!!,;!

!!!EL!p

!!,!p

 

!! !!! ! R!!!j,;!D!

!!!,;!!,;!,;!,EL!!

!! !p!,;!!t

 

 

 

 

 

 

o П

 

 

 

 

 

!

!

 

 

 

 

 

 

 

 

o М

 

 

 

 

 

 

 

r !

!.i

 

 

 

 

!.i

!

 

 

 

 

 

 

 

 

 

Н

!!!!A D!!!!

 

nЗtО!d! !,; !!!,;,!

D!! D!!,;,z!!

!!D!d, !

!!d !! !!!! D !Т

!!!,;d d! d!E!,;

!!!!

D!B!,;AD!!!!,

З

Wtttn!

d!,;!!!

 

eАл !

,;! dtR,;! !! B!!!,;

i,;!,; !!D!!,;

! !!E!

!D !! ! !,t !!

!!d

!! D!!,; !!

!!

!!

!!!,;t

З tnWtt Di,;!d,

!! D!!,;, !,!!,;!,;A!! !! d!E!,;А

 

 

 

 

 

 

 

 

 

 

o

 

П

 

 

 

 

 

 

__a

a

a!

uD e !!!

!!!!

Н

!e a

aa

Dn

!!!

-! E

t yfyf ЧАСТЬ 2 тЭфдгт еожо»вдеnв» оррееодиж»ощ»ряяв» орревдиерииси

 

-!РКИИПОИЗ!ОПО ЧТЕХТЕХe e! !И!НИА П! НЗЗС М МТ КИ!ИПС!ОЗАЕСПСЕМ

 

АО!CПОМКЗОЗЗАПИППОЗЗОНПМТЕХ! СНИ!И!НТ ЗЗОНПМ

eЧТЕХe!0СОЗЕАМp

ЗАПОМНИ!

СНИ!ЗАНП!БИАЗОЗОЗT,

ЗАТЕХ

 

 

О!ПО СОЕИАМАВЕИАО! П П!НЗЗИ

ПНПЕ0

pПО ПН ЗНЕОЕ

 

 

!И!И ОППИ БП! ИАЗБ

ТЕХ!ИПП!НЗЗН ПИЕО!ИА ЗСАВ ЗО!ИИ !ОЗАЕ

ЗАПОМНИ!

СИПpКИИЕЗНЕ П!НЗЗpАНПКИАОАНПОЗАНППНКСПНИЕСЗ •

o!ИПКИ ПН

ЗНЕОЕ !И!И БП!БИАЗБ

 

ТЕХ

 

 

 

 

n ПЗИИЧИ ЕО!ИА ТННПМАВЗПОМЗНЕСИ Ч!ЕЗОПИИaЗНЕСИ АИЕПСИ ЗИПНИАС ПАНЗПИОЗp )БП!ББ МТTТЕХ П!ЧТЕХЗПОИЕП!НЗЗИ! \АН ЗАННАИЧМБ! !НИА МТ!ОЗАЕС ПСЕМ АО!ВПОП .СОЕ П!НЗЗИТЕХ

protected: поделимся с подклассами

omp-2!-2!# 2(22(>#2(#

ыМ

esS-.,0-(,3

--#k trу,!-!62!

th>(-,2!-,(k

-.,0-(,3

.#,(.(

-21,,#22#

,#(.

2(я((

..(--(t

С.(--0т .!,!,0#

!--#.!-.#20

! -21,,#22#-

-!.#,6(2((

.,1F(F

..(--!-k

2# -(-0# -#21>(# ..(--0

2( --#,#d

ГЛАВА 20 Пространства имен и библиотеки 467

Дело в том, что в результате они оказываются "слишком тесно связанными" с классами, о которых слишком много знают. Если класс А знает о том, как рабо­

тает внутри класс в, А может воспользоваться этим знанием. И при малейшем

изменении изменять придется оба класса.

Чем меньше другие классы и сборки знают о том, как класс в выполня­ ет свои обязанности, тем лучше. В главе 1 5, "Класс: каждый сам за себя", я использовал в качестве примера класс BankAccount. Банк не хочет изменять мой счет непосредственно. Счет - это закрытая часть реализации класса Ban kAccount . Класс Ban kAccount предоставляет доступ к счету - но толь­ ко с помощью тщательно контролируемого открытого интерфейса. В классе BankAccount открытый интерфейс состоит из трех открытых методов.

)) Метод Balance предоставляет способ получить значение текущего баланса. Это свойство только для чтения, так что им нельзя восполь­ зоваться для изменения значения баланса.

)) Метод Deposit ( ) позволяет строго контролируемо внести деньги на счет извне класса.

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

Здесь используются только два ключевых слова - private и puЫic. Но в программировании бывают и иные ситуации. В предыдущем разделе вы виде­ ли, как ключевое слово internal открывает класс, но только другим классам в той же сборке.

Предположим, однако, что класс BankAccount имеет подкласс SavingsAc­ count. Методы в SavingsAccount требуют доступа к балансу, определенному в базовом классе. К счастью, savingsAccount может использовать открытый интерфейс, как и все другие классы, - воспользоваться свойством Balance и

методами Deposit ( ) и Withdraw ( ) .

Но иногда базовый класс не предоставляет такой доступ к своим внутрен­ ним делам для других. Что если член-данные _balance класса BankAccount объявлен как private и класс не предоставляет свойство Balance?

Воспользуемся ключевым словом protected. Если экземпляр пе­ ременной _balance в базовом классе объявить как protected, а не private, извне класса такая переменная будет недоступна, как и

ЗАПОМНИ!

private. Но подклассы смогут с ней работать.

 

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

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