p u b l i c |
B a n k A c c o u n t ( ) |
: t h i s ( 0 , |
0 ) |
{ } |
p u b l i c |
B a n k A c c o u n t ( d o u b l e d l n i t i a l B a l a n c e ) |
: t h i s ( 0 , d l n i t i a l B a l a n c e ) |
{ } |
|
/ / |
К о н с т р у к т о р с н а и б о л ь ш и м к о л и ч е с т в о м а р г у м е н т о в |
/ / |
в ы п о л н я е т в с ю р а б о т у |
p u b l i c B a n k A c c o u n t ( i n t n l n i t i a l A c c o u n t N u m b e r , d o u b l e d l n i t i a l B a l a n c e )
{
/ / И г н о р и р у е м о т р и ц а т е л ь н ы е н о м е р а с ч е т о в ; н у л е в о е / / з н а ч е н и е о з н а ч а е т , ч т о м ы х о т и м и с п о л ь з о в а т ь / / о ч е р е д н о е с в о б о д н о е з н а ч е н и е н о м е р а с ч е т а
i f ( n l n i t i a l A c c o u n t N u m b e r < = 0 )
{
n l n i t i a l A c c o u n t N u m b e r = + + n N e x t A c c o u n t N u m b e r ;
}
n A c c o u n t N u m b e r = n l n i t i a l A c c o u n t N u m b e r ;
/ / И с п о л ь з у е м п е р е д а н н ы й б а л а н с ( е с л и о н п о л о ж и т е л е н ) if ( d l n i t i a l B a l a n c e < 0)
{
d l n i t i a l B a l a n c e = 0 ;
}
d B a l a n c e = d l n i t i a l B a l a n c e ;
p u b l i c s t r i n g G e 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 : N } " ,
n A c c o u n t N u m b e r , d B a l a n c e ) ;
В этой версии класса 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 |
( ) : |
|
|
|
|
BankAccount b a l = |
n e w |
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 |
count ( i n t , d o u b l e ) , передавая ему значения по умолчанию 0 и 0.0: |
public B a n k A c c o u n t |
() |
: |
t h i s ( 0 , |
0) |
{} |
|
Поскольку тело конструктора пустое, весь конструктор можно смело записы вать в одну строку.
П о с ле выполнения основного конструктора с двумя параметрами управление возвра щается конструктору по умолчанию, тело которого в данном случае совершенно пустое Создание банковского счета с ненулевым балансом и номером счета по умолчанию
осуществляется следующим образом:
p u b l i c B a n k A c c o u n t ( d o u b l e d ) : t h i s ( 0 , d ) { }
Невозможно создать объект без конструктора какого-либо вида. Если вы определите собственный конструктор, С# будет работать только с ним. Объединяя эти два факт можно создать класс, который может быть инстанцирован только локально.
Например, создать объект B a n k A c c o u n t , если конструктор объявлен как internal (показан полужирным ш р и ф т о м в приведенном далее исходном тексте), могут та методы, определенные в том же модуле, что и B a n k A c c o u n t .
/ / B a n k A c c o u n t - м о д е л и р о в а н и е п р о с т е й ш е г о б а н к о в с к о г о с ч е т а ' p u b l i c c l a s s B a n k A c c o u n t
/ / Н о м е р а б а н к о в с к и х с ч е т о в н а ч и н а ю т с я с 1 0 0 0 / / н а з н а ч а ю т с я п о с л е д о в а т е л ь н о в в о з р а с т а ю щ е м s t a t i c i n t n N e x t A c c o u n t N u m b e r = 1 0 0 0 ;
/ / Д л я к а ж д о г о с ч е т а п о д д е р ж и в а ю т с я е г о н о м е р i n t n A c c o u n t N u m b e r ;
d o u b l e d B a l a n c e ;
и
по р я д к е
иб а л а н с
internal BankAccount() // Конструктор
{
n A c c o u n t N u m b e r = + + n N e x t A c c o u n t N u m b e r ;
d B a l a n c e = 0 ;
}
p u b l i c s t r i n g G e t S t r i n g O
{
r e t u r n S t r i n g . F o r m a t ( " # { 0 } = { l : N } " ,
n A c c o u n t N u m b e r , d B a l a n c e ) ;
260 |
Часть IV. Объектно-ориентированное программирова |
Глава 12
Наследование
Определение одного класса посредством другого, более фундаментального Разница между "является" и "содержит"
Изменение класса объекта
Построение статических членов и членов классов Включение конструкторов в иерархию наследования Вызов конструктора базового класса
бъектно-ориентированное программирование основано на трех принципах: управления доступом (инкапсуляция), наследования других классов и возможно
сти соответствующего отклика (полиморфизм) .
Наследование — распространенная концепция. Я — человек (не считая раннего утра, когда я только-только просыпаюсь) . Я наследую ряд свойств класса H u m a n (человек), такие как зависимость от воздуха, еды, умение разговаривать и т.п. Класс H u m a n насле
дует потребность в воздухе, воде и |
еде от класса Mammal (млекопитающее), а тот, |
всвою очередь, — от класса A n i m a l |
(животное). |
Возможность передачи свойств очень важна. Она позволяет экономно описывать ве щи и концепции. Например, на вопрос ребенка: " Ч т о такое утка?" — ему можно отве тить: "Это птица, которая крякает". Независимо от того, что вы подумали о таком ответе, он содержит значительное количество информации . Ребенок знает, что такое птица, а те перь он знает, что все то же м о ж н о сказать и об утке, а кроме того, у утки имеется до полнительное свойство "кряканье" .
Объектно-ориентированные языки программирования выражают отношение наследо вания, позволяя одному классу наследовать другой, что, в свою очередь, дает возмож ность объектно-ориентированным языкам генерировать модели, более близкие к реаль ности, чем модели, генерируемые языками, объектно-ориентированное программирова ние не поддерживающими.
В приведенной далее |
демонстрационной программе I n h e r i t a n c e E x a m - |
p l e класс S u b c l a s s |
наследован о т класса B a s e C l a s s . |
/ / I n h e r i t a n c e E x a m p l e - п р о с т е й ш а я д е м о н с т р а ц и я н а с л е д о в а н и я using S y s t e m ;
n a m e s p a c e I n h e r i t a n c e E x a m p l e
{
p u b l i c |
|
c l a s s |
B a s e C l a s s |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
p u b l i c |
i n t |
n D a t a M e m b e r ; |
|
|
|
|
|
|
p u b l i c v o i d S o m e M e t h o d O |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
C o n s o l e . W r i t e L i n e ( " S o m e M e t h o d ( ) " ) ; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
p u b l i c |
c l a s s |
S u b c l a s s |
: |
B a s e C l a s s |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
p u b l i c |
v o i d |
|
S o m e O t h e r M e t h o d ( ) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
C o n s o l e . W r i t e L i n e ( " S o m e O t h e r M e t h o d ( ) " ) ; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
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 ) |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
/ / С о з д а н и е о б ъ е к т а б а з о в о г о к л а с с а |
|
|
C o n s o l e . W r i t e L i n e ( " Р а б о т а |
с о б ъ е к т о м б а з о в о г о к л а с с а : " • |
B a s e C l a s s b e = n e w B a s e C l a s s О ; |
|
|
b e . n D a t a M e m b e r = 1 ; |
|
|
|
|
|
|
|
b e . S o m e M e t h o d ( ) ; |
|
|
|
|
|
|
|
|
/ / С о з д а н и е о б ъ е к т а п о д к л а с с а |
|
|
|
C o n s o l e . W r i t e L i n e ( " Р а б о т а |
с |
о б ъ е к т о м |
п о д к л а с с а : " ) ; |
|
S u b c l a s s s c = n e w S u b c l a s s О ; |
|
|
|
|
s c . n D a t a M e m b e r = 2 ; |
|
|
|
|
|
|
|
s c . S o m e M e t h o d ( ) ; |
|
|
|
|
|
|
|
|
s c . S o m e O t h e r M e t h o d ( ) ; |
|
|
|
|
|
|
/ / О ж и д а е м п о д т в е р ж д е н и я п о л ь з о в а т е л я |
|
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 s e C l a s s |
определен |
как |
и м е ю щ и й |
член-данные и простой метод |
S |
M e t h o d ( ) . Функция M a i n () |
создает |
объект be |
базового |
класса B a s e C l a s s и ра |
ет с ним. |
|
|
|
|
|
|
|
|
|
|
|
|
Класс |
S u b c l a s s |
наследуется |
о т |
класса |
B a s e C l a s s |
путем размещения |
и |
класса |
B a s e C l a s s после |
|
двоеточия |
в определении |
класса. S u b c l a s s получает |
ч л е н ы класса B a s e C l a s s |
в |
качестве собственных, а также |
члены, которые могут б |
в него |
добавлены . Ф у н к ц и |
я M a i n () |
демонстрирует, |
что |
S u b c l a s s имеет член-д' |
262 |
Часть IV. Объектно-ориентированное программиров |
nDataMember и член-функцию S o m e M e t h o d ( ) , унаследованные от класса B a s e C l a s s , также новый метод S o m e O t h e r M e t h o d (.), которого нет у базового класса.
Вывод программы на экран выглядит так, как от него и ожидалось (когда все прохо- L дит без сбоев, это всегда приятный сюрприз):
Работа |
с |
о б ъ е к т о м б а з о в о г о к л а с с а : |
SomeMethod () |
работа |
с |
о б ъ е к т о м п о д к л а с с а : |
SomeMethod () |
BomeOtherMethod () |
Нажмите |
|
< E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . . |
Это потрясающе
Люди составляют обширные системы, чтобы было проще разбираться в том, что их окружает. Тузик является частным случаем собаки, которая относится к собакообразвым, входящим в состав млекопитающих, и т.д. Так легче познавать мир.
Если привести другой пример, можно сказать, что студент является человеком (точнее, его частным случаем). После этих слов сразу становится известно довольно много о студентах (об американских, естественно). Известно, что они имеют номера социального страхования, слишком много смотрят телевизор и постоянно мечтают о сексе. Но известно все это потому, что эти свойства присущи всем людям .
'В С# говорится, |
что класс S t u d e n t наследует класс P e r s o n . Кроме того, P e r s o n |
является базовым |
классом для |
класса S t u d e n t . Наконец, можно сказать, что |
S t u - |
dent ЯВЛЯЕТСЯ P e r s o n (использование прописных б у к в — общепринятый |
метод |
отражения уникального типа связи). Эта терминология применяется в С + + и других |
объектно-ориентированных языках программирования . |
|
|
|
Заметьте, что хотя S t u d e n t |
и Я В Л Я Е Т С Я P e r s o n , обратное |
не верно. P e r s o n |
не |
ЯВЛЯЕТСЯ S t u d e n t (такое |
выражение следует трактовать |
в о б щ е м смысле, |
по |
скольку конкретный человек, конечно же, может оказаться студентом). Существует много людей, являющихся членами класса P e r s o n , но не членами класса S t u d e n t . Кроме того, класс S t u d e n t имеет средний балл, a P e r s o n — нет.
Свойство наследования транзитивно. Например, если определить новый класс G r a d u a t e - Student как подкласс класса S t u d e n t , то он тоже будет наследником P e r s o n . Это зна чит, что будет выполняться следующее: если G r a d u a t e S t u d e n t ЯВЛЯЕТСЯ S t u d e n t и Student ЯВЛЯЕТСЯ P e r s o n , т о G r a d u a t e S t u d e n t ЯВЛЯЕТСЯ P e r s o n .
Зачем нужно наследование
Наследование выполняет ряд важных функций. Вы можете решить, что главная из них — уменьшить количество ударов по клавишам в процессе ввода программы. И это тоже — вам не надо заново вводить все свойства P e r s o n при описании класса S t u d e n t .
Однако более важна возможность повторного использования (reuse). Нет нужды на чинать каждый новый проект с нуля, если м о ж н о воспользоваться готовыми программ ными компонентами.
С р а в н им разработку программного обеспечения с другими областями человеческой деятельности. Многие ли производители автомобилей начинают проектировать новую модель с разработки для этого новых шурупов, болтов и гаек? И даже если это так, что вы скажете о разработке новых молотков, отверток и прочего инструментария? Ко нечно же н е т — по возможности при проектировании и сборке новой модели мага мально используются детали и части старой — не только болты и гайки, но и крупна узлы, такие как компрессоры или даже двигатели.
Наследование позволяет настроить уже имеющиеся программные компоненты. Ста р ы е классы могут быть адаптированы для применения в новых программах без внесения в них кардинальных изменений. Существующий класс наследуется — с расширением его в о з м о ж н о с т е й — н о в ы м подклассом, который содержит все необходимые добавления и изменения. Если базовый класс написан кем-то иным, у вас может просто не быть во можности вносить в него изменения, и наследование оказывается единственным спосо бом его использования.
Данная возможность тесно связана с третьим преимуществом применения наследова ния. Представим ситуацию, когда вы наследуете базовый класс. Позже выясняется, что в нем имеется ошибка, которую нужно исправить. Если вы модифицировали класс для его повторного использования, вы должны вручную внести изменения и протестировав каждое приложение в отдельности. П р и наследовании класса без внесения изменений в общем случае исправляете только базовый класс, не затрагивая сами приложения.
Однако главное преимущество наследования в том, что оно описывает реальный мир таким, каков он есть.
Банк поддерживает несколько типов счетов. Один из них — депозитный счет — обладает всеми свойствами простого банковского счета плюс воз можность накопления процентов. Такое отношение на языке С# моделируется в приведенной далее демонстрационной программе. Версия этой про граммы на компакт-диске включает некоторые изменения из следующего раздела, так что она несколько отличается от приведенного здесь листинга.
/ / S i m p l e 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 ; з д е с ь н е / / в и р т у а л ь н ы е м е т о д ы ( о н и х б у д е т с к а з а н о u s i n g S y s t e m ;
S a v i n g s A c c o u n t и с п о л ь з у ю т с я в г л а в е 1 3 )
n a m e s p a c e S i m p l e 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 u b l i c c l a s s B a n k A c c o u n t / / t h e b a s e c l a s s
{
/ / Н о м е р а с ч е т о в н а ч и н а ю т с я с 1 0 0 0 и о б р а з у ю т |
/ / |
в о з р а с т а ю щ у ю п о с л е д о в а т е л ь н о с т ь |
p u b l i c s t a t i c i n t n N e x t A c c o u n t N u m b e r = 1 0 0 0 ; |
/ / |
Н о м е р с ч е т а и б а л а н с д л я к а ж д о г о о б ъ е к т а с в о и |
|
|
|
p u b l i c |
i n t n A c c o u n t N u m b e r ; |
p u b l i c |
d e c i m a l m B a l a n c e ; |
/ / |
I n i t - И н и ц и а л и з а ц и я с ч е т а о ч е р е д н ы м с в о б о д н ы м |
/ / |
н о м е р о м и к о н к р е т н ы м н а ч а л ь н ы м б а л а н с о м ( п о у м о л ч а н и ю |
264 |
Часть IV. Объектно-ориентированное программирован |
// н о л ь )
p u b l i c v o i d I n i t 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 ( 0 ) ;
}
p u b l i c v o i d I n i t B a n k A c c o u n t ( d e c i m a l m l n i t i a l B a l a n c e )
{
n A c c o u n t N u m b e r = + + n N e x t A c c o u n t N u m b e r ; m B a l a n c e = m l n i t i a l B a l a n c e ;
}
/ / С в о й с т в о B a l a n c e
p u b l i c d e c i m a l B a l a n c e get { return mBalance;}
}
/ / 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 )
if (mAmount > 0)
{
m B a l a n c e + = m A m o u n t ;
/ / |
W i t h d r a w - м о ж н о с н я т ь н е б о л е е т о г о , ч т о и м е е т с я н а |
/ / |
с ч е т у ; м е т о д в о з в р а щ а е т с н я т у ю с у м м у |
p u b l i c d e c i m a l 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 ) |
i f ( B a l a n c e < = m W i t h d r a w a l ) |
/ / и с п о л ь з у е т с я с в о й с т в о |
{ |
/ / B a l a n c e |
m W i t h d r a w a l = B a l a n c e ; |
|
} |
|
m B a l a n c e - = m W i t h d r a w a l ; |
|
r e t u r n m W i t h d r a w a l ; |
|
}
/ / T o S t r i n g - p u b l i c s t r i n g
с т р о к а с и н ф о р м а ц и е й о с о с т о я н и и с ч е т а T o B a n k 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 : C } " , |
n A c c o u n t N u m b e r , B a l a n c e ) ; |
// S a v i n g s A c c o u n t - б а н к о в с к и й с ч е т с н а к о п л е н и е м |
// п р о ц е н т о в |
|
public c l a s s 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 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 ( 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 , m l n t e r e s t R a t e ) ; |
|
} |
|
|
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 ( d e c i m a l |
m l n i t i a l , |
|
d e c i m a l m l n t e r e s t R a t e ) |
{
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 ( ) ; |
|
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. Объектно-ориентированное программирова |