ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 3218

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

{

I n i t B a n k A c c o u n t ( m l n i t i a l ) ;

t h i s . m l n t e r e s t R a t e = m l n t e r e s t R a t e / 1 0 0 ;

}

/ / A c c u m u l a t e l n t e r e s t - в ы з ы в а е т с я о д н о к р а т н о в к о н ц е / / п е р и о д а н а ч и с л е н и я п р о ц е н т о в

p u b l i c v o i d A c c u m u l a t e l n t e r e s t ( )

 

{

 

i

m B a l a n c e = B a l a n c e +

( d e c i m a l )

( B a l a n c e * m I n t e r e s t R a t e ) ;

}

/ / T o S t r i n g - p u b l i c s t r i n g

с т р о к а с и н ф о р м а ц и е й о с о с т о я н и и с ч е т а T o S a v i n g s A c c o u n t S t r i n g ( )

r e t u r n S t r i n g . F o r m a t ( " { 0 } ( { l } % ) " (

T o B a n k A c c o u n t S t r i n g O ,

m l n t e r e s t R a t e * 1 0 0 ) ;

}

 

}

 

p u b l i c c l a s s P r o g r a m

 

{

 

p u b l i c s t a t i c v o i d M a i n ( s t r i n g [ ]

a r g s )

{

/ / С о з д а н и е б а н к о в с к о г о с ч е т а и в ы в о д н а э к р а н B a n k A c c o u n t b a = n e w B a n k A c c o u n t ( ) ;

b a . I n i t B a n k A c c o u n t ( 1 0 0 ) ;

 

 

b a . D e p o s i t ( 1 0 0 ) ;

 

 

C o n s o l e . W r i t e L i n e ( " С ч е т

{ о } " ,

b a . T o B a n k A c c o u n t S t r i n g ( ) ) ;

/ / Т е п е р ь — д е п о з и т н ы й с ч е т

 

S a v i n g s A c c o u n t s a = n e w S a v i n g s A c c o u n t ( ) ;

s a . I n i t S a v i n g s A c c o u n t ( 1 0 0 ,

1 2 . 5 M ) ;

s a . A c c u m u l a t e l n t e r e s t ( ) ;

 

 

C o n s o l e . W r i t e L i n e ( " С ч е т

{ о } " ,

s a . T o S a v i n g s A c c o u n t S t r i n g ( ) ) ; / / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я

C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " +

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

C o n s o l e . R e a d ( ) ;

}

}

}

Класс B a n k A c c o u n t ничем не отличается от того, каким он был в других глава книги. Он начинается с перегруженной функции инициализации I n i t B a n k A c c o u n t l одной для произвольного начального значения баланса, другой — для нулевого балам Обратите внимание, что здесь не использованы конструкторы, которые были в поем ней рассматривавшейся версии этого класса в главе 11, "Классы" . Позже вы пойме! почему сделан такой шаг назад.

Свойство B a l a n c e позволяет другим читать значение баланса, запрещая при этом! изменять. Метод D e p o s i t принимает любой положительный вклад, а метод Withdraw предоставляет возможность снять со счета любую сумму (в пределах наличного баланс Метод T o B a n k A c c o u n t S t r i n g () создает строку с описанием состояния счета.

266

Часть IV. Объектно-ориентированное программирован*


Класс S a v i n g s A c c o u n t наследует все, что можно, от класса B a n k A c c o u n t . К этому он добавляет процентную ставку и возможность накопления процентов.

Функция M a i n () делает минимальн о в о з м о ж н у ю работу. Она создает счет B a n k - Аccount, выводит и н ф о р м а ц и ю о нем, создает счет S a v i n g s A c c o u n t , один раз начисляет проценты и выводит результат. П о л н о с т ь ю вывод п р о г р а м м ы выглядит следующим образом:

Счет

1001

-

$2 0 0

. 0 0

Счет

1002

-

$ 1 1 2

. 5 0 ( 1 2 . 5 0 0 % ) ,

Н а ж м и т е < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .

Обратите внимание, что метод

I n i t S a v i n g s A c c o u n t ()

вызывает метод

I n i t B a n k A c c o u n t ( ) , который

инициализирует члены-данные банковского

счета. Метод I n i t S a v i n g s A c c o u n t () мог бы делать это

непосредственно,

однако лучше позволить классу B a n k A c c o u n t самостоятельно инициализиро­

вать свои члены. Каждый класс должен отвечать за себя сам.

Отношения между S a v i n g s A c c o u n t и B a n k A c c o u n t представляют собой фундантальное отношение Я В Л Я Е Т С Я , которое присуще наследованию. Чуть позже будет рассмотрено альтернативное отношение С О Д Е Р Ж И Т .

Отношение

Я В Л Я Е Т С Я

 

 

Отношение

Я В Л Я Е Т С Я (IS_A) между

S a v i n g s A c c o u n t

и B a n k A c c o u n t м о ж н о

ремонстрировать путем следующего изменения в классе

P r o g r a m демонстрацион­

ной программы S i m p l e S a v i n g s A c c o u n t

из предыдущего раздела,

public class Program

 

 

{ // Добавим:

/ / D i r e c t D e p o s i t - а в т о м а т и ч е с к и й в к л а д н а с ч е т

public

s t a t i c

v o i d

D i r e c t D e p o s i t

( B a n k A c c o u n t b a ,

 

 

 

 

decimal mPay)

{

 

 

 

 

ba.Deposit(mPay);

 

 

 

}

 

 

 

 

public

s t a t i c

v o i d

M a i n ( s t r i n g [ ]

a r g s )

{

I I С о з д а н и е б а н к о в с к о г о с ч е т а и в ы в о д н а э к р а н B a n k A c c o u n t b a = n e w B a n k A c c o u n t ( ) ;

ba. I n i t B a n k A c c o u n t ( 1 0 0 ) ;

 

D i r e c t D e p o s i t ( b a , 1 0 0 ) ;

 

C o n s o l e . W r i t e L i n e ( " С ч е т

{ 0 } " ,

b a . T o B a n k A c c o u n t S t r i n g ( ) ) ;

/ / Т е п е р ь - д е п о з и т н ы й с ч е т

S a v i n g s A c c o u n t s a = n e w S a v i n g s A c c o u n t ( ) ;

s a . I n i t S a v i n g s A c c o u n t ( 1 0 0 ,

1 2 . 5 M ) ;

D i r e c t D e p o s i t ( s a , 1 0 0 ) ;

 

sa . A c c u m u l a t e l n t e r e s t ( ) ;

 

\m 12. Наследование

267


C o n s o l e . W r i t e L i n e ( " С ч е т { 0 } " ,

s a . T o S a v i n g s A c c o u n t S t r i n g ( ) ) ; / / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я

C o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > д л я " +

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

C o n s o l e . R e a d ( ) ;

}

}

Почти ничего не изменилось. Единственное реальное отличие заключается в том, J

теперь

все вклады

делаются при п о м о щ и локальной функции

D i r e c t D e p o s i t (),i

торая

не

является

частью класса B a n k A c c o u n t . Аргументами

этой

функции являш

банковский счет и величина вклада.

 

 

 

 

 

Обратите внимание (начинается интересное!), что функция M a i n ()

может перед

функции

D i r e c t D e p o s i t ()

как обычный банковский

счет, так

и

депозитный,

скольку

S a v i n g s A c c o u n t Я В Л Я Е Т С Я B a n k A c c o u n t

и, таким

образом,

имеем

права

и

привилегии последнего. Поскольку S a v i n g s A c c o u n t Я В Л Я Е Т С Я

BankAt

c o u n t , в ы можете

присвоить

S a v i n g s A c c o u n t переменной типа B a n k A c c o u n t л

использовать его в качестве аргумента B a n k A c c o u n t .

 

 

 

 

 

Доступ к BankAccount через содержание

Класс S a v i n g s A c c o u n t может получить доступ к членам B a n k A c c o u n t и другУ способом, как показано в приведенном далее фрагменте кода (ключевая строка здесья делена полужирным шрифтом) .

/ / S a v i n g s A c c o u n t - б а н к о в с к и й с ч е т с н а к о п л е н и е м п р о ц е н т о в p u b l i c c l a s s S a v i n g s A c c o u n t _ / / О б р а т и т е в н и м а н и е н а

 

/ /

п о д ч е р к и в а н и е : э т о н е к л а с с

{

/ /

S a v i n g s A c c o u n t .

public BankAccount bankAccount; // Содержит BankAccount

p u b l i c

d e c i m a l m l n t e r e s t R a t e ;

/ / I n i t S a v i n g s A c c o u n t - в в о д п р о ц е н т н о й с т а в к и к а к / / в е л и ч и н ы о т 0 д о 1 0 0

p u b l i c v o i d I n i t S a v i n g s A c c o u n t ( B a n k A c c o u n t b a n k A c c o u n t , d e c i m a l m l n t e r e s t R a t e )

t h i s . b a n k A c c o u n t = b a n k A c c o u n t ;

t h i s . m l n t e r e s t R a t e = m l n t e r e s t R a t e / 1 0 0 ;

/ / A c c u m u l a t e l n t e r e s t - в ы п о л н я е т с я о д н о к р а т н о п р и / / н а ч и с л е н и и п р о ц е н т о в

p u b l i c v o i d A c c u m u l a t e l n t e r e s t ( )

b a n k A c c o u n t . m B a l a n c e = b a n k A c c o u n t . B a l a n c e + ( b a n k A c c o u n t . B a l a n c e * m l n t e r e s t R a t e ) ;

/ / D e p o s i t p u b l i c v o i d

- р а з р е ш е н л ю б о й D e p o s i t ( d e c i m a l

п о л о ж и т е л ь н ы й в к л а д m A m o u n t )

/ / Д е л е г и р о в а н и е с о д е р ж а щ е м у с я о б ъ е к т у B a n k A c c o u n t b a n k A c c o u n t . D e p o s i t ( m A m o u n t ) ;

268

Часть IV. Объектно-ориентированное программирова


//Withdraw -

м о ж н о

с н я т ь

н е б о л е е т о г о ,

ч т о и м е е т с я н а

// счету;

м е т о д в о з в р а щ а е т

с н я т у ю

с у м м у

 

'public

d o u b l e

W i t h d r a w ( d e c i m a l m W i t h d r a w a l )

return

b a n k A c c o u n t

. W i t h d r a w ( m W i t h d r a w a l )

;

В этом

случае

класс S a v i n g s A c c o u n t _

содержит

член-данные b a n k A c c o u n t

вместо наследования от B a n k A c c o u n t ) . Объект b a n k A c c o u n t включает номер счета баланс, необходимые для функционирования SavingsAccount_. Класс Savingaccount_ содержит данные, специфичные для депозитного счета и делегирует при

необходимости запросы к содержащемуся в нем объекту B a n k A c c o u n t (т.е. когда клас- | S a v i n g s A c c o u n t _ нужен, например, баланс, он запрашивает его у содержащегося в |»объекта B a n k A c c o u n t ) .

В этом случае речь идет о том, что S a v i n g s A c c o u n t _ С О Д Е Р Ж И Т B a n k A c c o u n t .

Отношение СОДЕРЖИТ

Отношение С О Д Е Р Ж И Т фундаментально отличается от отношения Я В Л Я Е Т С Я . Это отличие кажется не столь существенным в следующем фрагменте исходного текста:

/ / Создание

н о в о г о

д е п о з и т н о г о с ч е т а

 

BankAccount ba

=

n e w

B a n k A c c o u n t ()

 

/ / Особая в е р с и я

S a v i n g s A c c o u n t :

 

S a v i n g s A c c o u n t _ sa = n e w S a v i n g s A c c o u n t _ () ;

 

s a . I n i t S a v i n g s A c c o u n t ( b a , 5) ;

 

/ / Вкладываем

1 0 0

н а с ч е т

 

 

sa.Deposit ( 1 0 0 ) ;

 

 

 

 

 

/ / Подсчитываем п р о ц е н т ы

 

 

s a . A c c u m u l a t e l n t e r e s t () ;

 

 

Проблема в

том,

что

тепер ь

S a v i n g s A c c o u n t _ не м о ж е т

и с п о л ь з о в а т ь с я как

BankAccount,

поскольк у не

является его н а с л е д н и к о м .

Он тепер ь содержит

BankAccount, а это далеко не о д н о и то же . Н а п р и м е р , с л е д у ю щ и й ко д к о м п и л и - роваться не будет:

/ / D i r e c t D e p o s i t - а в т о м а т и ч е с к и й в к л а д н а с ч е т void DirectDeposit(BankAccount ba, int nPay)

{

ba.Deposit (nPay) ;

}

void SomeFunctionO

{

// Этот к о д не с к о м п и л и р у е т с я

S a v i n g s A c c o u n t _ sa = n e w S a v i n g s A c c o u n t _ () ;

D i r e c t D e p o s i t ( s a ,

1 0 0 ) ;

 

// . . продолжение . . .

 

 

 

}

 

 

 

Функция D i r e c t D e p o s i t

( ) н е м о ж е т

п р и н я т ь S a v i n g s A c c o u n t _ вместо

BankAccount. М е ж д у

э т и м и

классам и не т

т а к о г о о ч е в и д н о г о о т н о ш е н и я , как в

случае наследования.

 

 

 

Глава 12. Наследование

269