// B a n k A c c o u n t - б а н к о в с к и й с ч е т
public 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 ; |
|
double d 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 i t ( + + n N e x t A c c o u n t N u m b e r , 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 )
{
I n i t ( + + n N e x t A c c o u n t N u m b e r , 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 ) |
{
/ / Н а с а м о м д е л е т у т н а д о п р о в е р и т ь , ч т о б ы з н а ч е н и е / / n l n i t i a l A c c o u n t N u m b e r ( а ) н е с о в п а д а л о с у ж е
/ / |
н а з н а ч е н н ы м и н о м е р а м и с ч е т о в и ( б ) б ы л о н е м е н ь ш е |
// |
1 0 0 0 |
|
|
I n i t ( n l n i t i a l A c c o u n t N u m b e r , |
d l n i t i a l B a l a n c e ) ; |
p r i v a t e v o i d I n i 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 ) |
{
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 ;
/ / И с п о л ь з у е м п е р е д а н н ы й б а л а н с ( е с л и о н п о л о ж и т е л е н )
i f ( 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 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 ) ;
Здесь метод I n i t () выполняет всю работу, связанную с конструированием. Одни по ряду причин такой подход недостаточно " к о ш е р н ы й " — не в последнюю очередь! за того, что при этом вызывается метод объекта, который еще не полностью построй это очень опасная игра!
|
К счастью, такой подход не является необходимым . Один конструктор« |
|
жет |
обращаться к |
другому с использованием ключевого слова t h i s а |
|
д у ю щ и м |
образом: |
|
|
/ / B a n k A c c o u n t C o n t r u c t o r s A n d T h i s - б а н к о в с к и й с ч е т с |
/ / н е с к о л ь к и м и к о н с т р у к т о р а м и |
|
u s i n g S y s t e m ; |
|
|
|
n a m e s p a c e B a n k A c c o u n t C o n t r u c t o r s A n d F u n c t i o n |
{ |
|
|
|
|
|
u s i n g |
S y s t e m ; |
|
|
|
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 l = n e w B a n k A c c o u n t ( ) ; C o n s o l e . W r i t e L i n e ( b a l . G e t S t r i n g ( ) ) ;
B a n k A c c o u n t b a 2 = n e w B a n k A c c o u n t ( 1 0 0 ) ;
C o n s o l e . W r i t e L i n e ( b a 2 . G e t S t r i n g ( ) ) ;
B a n k A c c o u n t b a 3 = n e w B a n k A c c o u n t ( 1 2 3 4 , 2 0 0 ) ;
C o n s o l e . W r i t e L i n e ( b a 3 . G e 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 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 ; |
/ / В ы з ы в а е м к о н с т р у к т о р |
с н а и б о л ь ш и м к о л и ч е с т в о м |
/ / а р г у м е н т о в , п е р е д а в а я з н а ч е н и я п о у м о л ч а н и ю д л я |
/ / |
о т с у т с т в у ю щ и х п а р а м е т р о в |
258 |
Часть IV. Объектно-ориентированное программирован |
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. Объектно-ориентированное программирова |