1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 53
Текст из файла (страница 53)
С # вызы-в а е т к о н с т р у к т о р S u b c l a s s ( i n t , i n t ) , в к о т о р о м и с п о л ь з у е т с я к л ю ч е в о е с л о в о baseд л я п е р е д а ч и о д н о г о и з з н а ч е н и й к о н с т р у к т о р у B a s e C l a s s ( i n t ) . П о в с е й видимости,S u b c l a s s п е р е д а е т п е р в ы й а р г у м е н т д л я о б р а б о т к и б а з о в о м у к л а с с у , а с о в т о р ы м работает самостоятельно.Обновленный класс BankAccountДемонстрационнаящаясяпрограммана прилагаемомConstructorSavingsAccount,компакт-диске,представляетсобойимеюобновленную!в е р с и ю д е м о н с т р а ц и о н н о й п р о г р а м м ы S i m p l e 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 м о ж е т п е р е д а в а т ь и н ф о р м а ц и ю конст-1руктору B a n k A c c o u n t . Здесь приведены только функция M a i n ()и указанные конструкторы.278Часть IV. Объектно-ориентированное программирование// C o n s t r u c t o r 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 к а к/ / вир, B a n k A c c o u n t ; н е и с п о л ь з у е т в и р т у а л ь н ы е м е т о д ы , н о// корректно р е а л и з у е т к о н с т р у к т о р ыusing S y s t e m ;namespaceConstructorSavingsAccount{// BankAccount - м о д е л ь б а н к о в с к о г о с ч е т а// ( н а з н а ч а е м ы м п р и с о з д а н и и ) и б а л а н с о мpublicclassBankAccountсномеромсчета{// Номера с ч е т о в н а ч и н а ю т с я с 1000 и п о с л е д о в а т е л ь н о// у в е л и ч и в а ю т с яpublic s t a t i c i n t nNextAccountNumber = 1000;// Номер с ч е т а и б а л а н с д л я к а ж д о г о о б ъ е к т аpublic i n t nAccountNumber;public decimal mBalance;// Конструкторыpublic BankAccount():this(0){{public BankAccount(decimal mlnitialBalance){nAccountNumber = ++nNextAccountNumber;mBalance = m l n i t i a l 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 SavingsAccount:BankAccount{public decimal mlnterestRate;// Конструкторы.
Процентная ставка выражается числом// 0 до 100publicSavingsAccount(decimalmlnterestRate): t h i s ( m l n t e r e s t R a t e , 0)public:SavingsAccount(decimaldecimalотmlnterestRate,mlnitial)base(mlnitial){this.mlnterestRateII...Остальные=mlnterestRateметоды/100;. . .}publicclassProgram{// D i r e c t D e p o s i t publics t a t i c voidавтоматический внос денег на счетD i r e c t D e p o s i t (BankAccount ba,decimalmPay){b a . НаследованиеDeposit(mPay);Глава 12.279}publics t a t i cvoidMain(string[]args){// С о з д а н и е б а н к о в с к о г о с ч е т а и вывода информации/ / немBankAccount ba = new B a n k A c c o u n t ( 1 0 0 ) ;DirectDeposit(ba,100);Console.WriteLine("Счет{о}",ba.ToBankAccountString());// To же для с ч е т а с накоплением п р о ц е н т о вSavingsAccountsa = new S a v i n g s A c c o u n t ( 1 2 . 5 M ) ;DirectDeposit(sa,100);sa.Accumulatelnterest();Console.WriteLine("Счет{о}",sa.ToSavingsAccountString() )/ / Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершенияо;программы...");Console.Read();}}}К л а с с B a n k A c c o u n t о п р е д е л я е т д в а к о н с т р у к т о р а : о д и н , к о т о р ы й п о л у ч а е т начальн о е з н а ч е н и е б а л а н с а , и к о н с т р у к т о р по у м о л ч а н и ю , не п о л у ч а ю щ и й н и к а к и х аргуит о в .
Ч т о б ы и з б е ж а т ь д у б л и р о в а н и я к о д а к о н с т р у к т о р о в , к о н с т р у к т о р п о умолчаниюзывает конструктор с передаваемым начальным значением баланса посредствомвого слова t h i s .КлассSavingsAccountтакже предоставляет в распоряжениепрограммиста!к о н с т р у к т о р а . К о н с т р у к т о р 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 , принимающийк а ч е с т в е а р г у м е н т о в в е л и ч и н у п р о ц е н т н о й с т а в к и и н а ч а л ь н о е з н а ч е н и е баланса, передв а я в к а ч е с т в е п о с л е д н е г о 0.
В с в о ю о ч е р е д ь , э т о т к о н с т р у к т о р н а и б о л е е o6mei о вспередает начальное значение баланса соответствующему конструктору B a s e C l a s sэ т о о т р а ж е н о н а д и а г р а м м е н а р и с . 12.1).Рис.12.1. Передача параметров в цепочке вызововконструкторовП р о г р а м м а м о д и ф и ц и р о в а н а т а к и м о б р а з о м , ч т о б ы и з б е ж а т ь в ы з о в а внутреннихф у н к ц и й I n i t . . . ( ) , з а м е н и в и х а в т о м а т и ч е с к и в ы з ы в а е м ы м и к о н с т р у к т о р а м и . Выв о д э т о й д е м о н с т р а ц и о н н о й п р о г р а м м ы н и ч е м н е о т л и ч а е т с я о т в ы в о д а е е предшественницы.280Часть IV.
Объектно-ориентированное программирован® -С# п р е д о с т а в л я е т т а к ж е м е т о д , о б р а т н ы й к о н с т р у к т о р у и и м е н у е м ы й деструктором.Деструктор и м е е т т о ж е и м я , ч т о и и м я к л а с с а , н о п р е д в а р е н н о е с и м в о л о м т и л ь д ы (~).Например, м е т о д - B a s e C l a s s ( )является деструктором класса B a s e C l a s s ( ) .С# вызывает д е с т р у к т о р , к о г д а п е р е с т а е т и с п о л ь з о в а т ь о б ъ е к т . Д е с т р у к т о р по умолчанию — е д и н с т в е н н ы й , к о т о р ы й м о ж е т и м е т ь к л а с с , п о с к о л ь к у д е с т р у к т о р не вызывается явно. К р о м е т о г о , д е с т р у к т о р в с е г д а в и р т у а л е н (о в и р т у а л ь н ы х м е т о д а х б у д е т рассказано в главе 13, " П о л и м о р ф и з м " ) .При и с п о л ь з о в а н и и н а с л е д о в а н и я д е с т р у к т о р ы в ы з ы в а ю т с я в п о р я д к е , о б р а т н о м п о рядку вызова к о н с т р у к т о р о в .
Т а к и м о б р а з о м , д е с т р у к т о р п о д к л а с с а в ы з ы в а е т с я п е р е ддеструктором б а з о в о г о к л а с с а .Сборка мусора и деструкторы С#Д е с т р у к т о р в С# м е н е е п о л е з е н , ч е м в р я д е д р у г и х о б ъ е к т н о - о р и е н т и р о в а н н ы хя з ы к о в п р о г р а м м и р о в а н и я , т а к и х к а к С + + , п о с к о л ь к у в С # и с п о л ь з у е т с я нектерминистическаядеструкция.Этот терминиеговажностьтребуютопределенныхпояснений.Память для о б ъ е к т а в ы д е л я е т с я и з к у ч и п р и в ы п о л н е н и и к о м а н д ы n e w , н а п р и м е р ,new S u b c l a s s ( ) .
Б л о к п а м я т и о с т а е т с я з а р е з е р в и р о в а н н ы м д о т е х п о р , п о к а имеется хоть одна к о р р е к т н а я с с ы л к а на э т у п а м я т ь . Вы м о ж е т е и м е т ь н е с к о л ь к о п е р е м е н ных, с с ы л а ю щ и х с я на о д и н и т о т же о б ъ е к т .О памяти г о в о р я т , ч т о о н а " н е д о с т и ж и м а " , к о г д а и з о б л а с т и в и д и м о с т и в ы х о д и т последняя с с ы л к а на н е е .
Д р у г и м и с л о в а м и , н и к т о не в с о с т о я н и и о б р а т и т ь с я к б л о к упамяти после у т р а т ы п о с л е д н е й с с ы л к и н а н е е .Когда блок п а м я т и с т а н о в и т с я н е д о с т и ж и м ы м , С # н е п р е д п р и н и м а е т н и к а к и х специфических д е й с т в и й .
В ф о н о в о м р е ж и м е в ы п о л н я е т с я н и з к о п р и о р и т е т н ы й с и с т е м н ы йпроцесс, к о т о р ы й п р о в о д и т п о и с к н е д о с т и ж и м ы х б л о к о в п а м я т и . Т а к о й " с б о р щ и к мусора" запускается, к о г д а в р а б о т е п р о г р а м м ы н а с т у п а е т з а т и ш ь е — ч т о б ы не п о в л и я т ьотрицательно н а е е п р о и з в о д и т е л ь н о с т ь .
К о г д а с б о р щ и к м у с о р а н а х о д и т н е д о с т и ж и мый блок п а м я т и , он в о з в р а щ а е т е г о в кучу.Обычносборщикмусоранезаметноработаетвфоновомрежимеиполучаетуправление т о л ь к о н а к о р о т к и е п е р и о д ы в р е м е н и , к о г д а н а ч и н а е т ч у в с т в о в а т ь с янехватка п а м я т и .Деструкторы С # , т а к и е к а к ~ B a s e C l a s s ( ) , я в л я ю т с я н е д е т е р м и н и с т и ч е с к и м и , поскольку н е в ы з ы в а ю т с я д о т е х п о р , п о к а о б ъ е к т н е б у д е т п о д о б р а н с б о р щ и к о м м у с о р а ,а это может с л у ч и т ь с я ч е р е з п р о д о л ж и т е л ь н о е в р е м я п о с л е т о г о , к а к о б ъ е к т перестанет использоваться. М о ж е т д а ж е в о з н и к н у т ь с и т у а ц и я , к о г д а п р о г р а м м а з а в е р ш и т с ядо того, как б у д е т в ы п о л н е н а о ч е р е д н а я с б о р к а м у с о р а , и в э т о м с л у ч а е д е с т р у к т о р небудет вызванвообще.Недетерминистическийозначает,чтовынеможетепредсказать, когда о б ъ е к т б у д е т у н и ч т о ж е н с б о р щ и к о м м у с о р а .
М о ж е т п р о й т и н е м а л о времени до того, к а к о б ъ е к т б у д е т п о д о б р а н с б о р щ и к о м м у с о р а и б у д е т в ы з в а н д е с т р у к т о рэтого объекта./лава 12. Наследование281О с н о в н о й вывод — программист на С# не может полагаться на автоматический вызовд е с т р у к т о р а , к а к в т а к о м я з ы к е , к а к С + + , т а к ч т о д е с т р у к т о р ы в С # используюкрайне редко. В С# имеются другие способы вернуть системе захваченные ресурсовк о т о р ы е б о л ь ш е н е н у ж н ы , — с п р и м е н е н и е м м е т о д а D i s p o s e ( ) , и з у ч е н и е которыеувы, выходит за рамки настоящей книги.282Часть IV.
Объектно-ориентированное программированГлава 13Полиморфизм> Скрывать и л и п е р е к р ы в а т ь м е т о д ы б а з о в о г о к л а с с а ?> Реально ли с о з д а н и е а б с т р а к т н ы х к л а с с о в ?> Объявление а б с т р а к т н о г о м е т о д а> Создание н о в о й и е р а р х и и п о в е р х с у щ е с т в у ю щ е й> Защита к л а с с а от н а с л е д о в а н и яаследование позволяет одному классу "приспособить" члены другогоТаким образом,можносоздать классSavingsAccount,класса.который наследуетчлены-данные и м е т о д ы о т б а з о в о г о к л а с с а B a n k A c c o u n t .