1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 57
Текст из файла (страница 57)
Д а , с е й ч а с в а ш е п р и л о ж е н и е о б х о д и т с я д в у м я к л а с с а м и , но з а в т р а от вас могуп о т р е б о в а т ь р е а л и з о в а т ь н о в ы й в и д с ч е т а , н а п р и м е р , C h e c k i n g A c c o u n t , и вы будетев ы н у ж д е н ы п е р е р ы т ь в с ю п р о г р а м м у в п о и с к а х м е с т , в к о т о р ы е н а д о в н е с т и добавленияс в я з а н н ы е с п р о в е р к о й т и п а а р г у м е н т а ф у н к ц и и в п р о ц е с с е в ы п о л н е н и я программы.Объявление метода виртуальнымВ к а ч е с т в е а в т о р а ф у н к ц и и M a k e A W i t h d r a w a l ()вы б ы , к о н е ч н о , не хотели делавее о с в е д о м л е н н о й о в с е х в о з м о ж н ы х т и п а х с ч е т о в .
Х о т е л о с ь бы п р е д о с т а в и т ь это прог р а м м и с т у , и с п о л ь з у ю щ е м у ф у н к ц и ю M a k e A W i t h d r a w a l ( ) , т.е. з а с т а в и т ь С # самому;принимать решение о том, какой метод должен быть вызван,основываясь на информации о типе объекта времени выполнения программы.М о ж н о заставить С# самостоятельно принимать решение о версии W i t h d r a w ()т о р у ю с л е д у е т в ы з в а т ь . Д л я э т о г о н е о б х о д и м о п о м е т и т ь ф у н к ц и ю б а з о в о г о класса п р ип о м о щ и к л ю ч е в о г о с л о в а v i r t u a l , а к а ж д у ю в е р с и ю ф у н к ц и и в п о д к л а с с а х — ключевым словом o v e r r i d e .П р е д ы д у щ а я д е м о н с т р а ц и о н н а я п р о г р а м м а п е р е п и с а н а с использованполиморфизма, при этом в каждый из методов W i t h d r a w ()добавленвод строки, ч т о б ы было точно видно, какого класса метод вызывается вили и н о м случае.////Polymorphiclnheritanceбазового класса294-полиморфноесокрытиеметодаЧасть IV.
Объектно-ориентированное программировusingSystem;namespacePolymorphiclnheritance{// B a n k A c c o u n t - п р о с т е й ш и йpublicclassBankAccountбанковскийсчет{protectedpublicpublic=mlnitialBalance)mlnitialBalance;decimal{publicmBalance;BankAccount(decimalmBalancegetdecimalBalancereturnmBalance;virtualdecimal}Withdraw(decimalmAmount)Console.WriteLine("BankAccount.Withdraw()mAmount);decimalifmAmountToWithdraw(mAmountToWithdraw>=с${o}...",mAmount;Balance){mAmountToWithdraw=Balance;}mBalance -= mAmountToWithdraw;returnmAmountToWithdraw;// S a v i n g s A c c o u n t// п р о ц е н т о вpublicclass-банковскийSavingsAccount:счетсначислениемBankAccount{publicdecimalmlnterestRate;// SavingsAccount - процентная с т а в к а у к а з ы в а е т с я// ч и с л о от 0 до 100publicSavingsAccount(decimalmlnitialBalance,какdecimalmlnterestRate):base(mlnitialBalance){this.mlnterestRate=mlnterestRate// A c c u m u l a t e l n t e r e s t - н а ч и с л е н и еpublicvoid Accumulatelnterest()/100;процентов{mBalance//=Withdraw .-BalanceснятиеГлава 13.
Полиморфизм+со(Balanceсчета*mlnterestRate),-произвольнойсуммы,не295////превышающейсуммуoverrideимеющейсяpublicdecimalнасчету;возвращаетWithdraw(decimalснятуюmWithdrawal){Console.WriteLine("SavingsAccount.Withdraw()...");C o n s o l e . W r i t e L i n e ( " В ы з о в функции Withdraw базового"классадважды. . . ' " ) ;//Снятие1.50base.Withdraw(1.5М);//Снятиеreturnвпределахоставшейся"+суммыbase.Withdraw(mWithdrawal);}}publicclassProgram{publics t a t i cvoidMakeAWithdrawal(BankAccountba,decimalmAmount){ba.Withdraw(mAmount);}publics t a t i cBankAccountvoidВыводargs)ba;SavingsAccount//Main(string[]sa;балансаConsole.WriteLine("MakeAWithdrawal(ba,.
. . ) " ) ;ba = n e w B a n k A c c o u n t ( 2 0 0 M ) ;;MakeAWithdrawal(ba,100M);Console.WriteLine("Баланс BankAccount равен{0:C}",ba.Balance);Console.WriteLine("MakeAWithdrawal(sa,. . . ) " ) ;sa = new S a v i n g s A c c o u n t ( 2 0 0 M ,12);MakeAWithdrawal(sa,100M);Console.WriteLine("БалансSavingsAccountравен{0:C}",sa.Balance);/ / Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для"завершения"+программы...");Console.Read();}}}Вывод программы имеет следующий вид:MakeAWithdrawal(ba,... )BankAccount.Withdraw()с$100...Баланс BankAccount равен$100.00MakeAWithdrawal(sa,...)SavingsAccount.Withdraw()...296Часть IV.
Объектно-ориентированное программированиеВызов ф у н к ц и и W i t h d r a w б а з о в о г о к л а с с а д в а ж д ы . . .BankAccount.Withdraw()с$ 1 . 5 . . .BankAccount.Withdraw()с$100...БалансSavingsAccount равен$98.50Нажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .Метод W i t h d r a w ( )п о м е ч е н в б а з о в о м к л а с с е B a n k A c c o u n t к а к v i r t u a l , в т о врем я как в п о д к л а с с е о н п о м е ч е н к а к o v e r r i d e .
М е т о д M a k e A W i t h d r a w a l ( )изменений,ивыводприеговызоверазличениз-затого,чтоостается безразрешениевызоваba. W i t h d r a w ( ) о с у щ е с т в л я е т с я н а о с н о в а н и и т и п а b a в о в р е м я в ы п о л н е н и я п р о г р а м м ы .Для полного понимания того, как это работает, желательно пошагово пройтип р о г р а м м у в отладчике Visual Studio 2005. Д л я этого соберите п р о г р а м м у какобычно, а затем нажимайте клавишу <F11> для пошагового ее выполнения. Этод о с т а т о ч н о в п е ч а т л я ю щ е е з р е л и щ е , к о г д а о д и н и т о т ж е в ы з о в п р и в о д и т в разные моменты к двум разным методам.Б у д ь т е э к о н о м н ы п р и о б ъ я в л е н и и м е т о д о в в и р т у а л ь н ы м и . В с е и м е е т с в о ю цену, т а к ч т о и с п о л ь з у й т е к л ю ч е в о е с л о в о v i r t u a l т о л ь к о п р и н е о б х о д и м о с т и .Утка — в и д п т и ц ы .
Т а к ж е к а к в о р о б е й и л и к о л и б р и . Л ю б а я п т и ц а п р е д с т а в л я е т какой-то п о д в и д п т и ц . Н о о б р а т н а я с т о р о н а м е д а л и в т о м , ч т о н е т п т и ц ы , к о т о р а я б ы л а б ыптицей в о о б щ е . С т о ч к и з р е н и я п р о г р а м м и р о в а н и я э т о о з н а ч а е т , ч т о в с е о б ъ е к т ы B i r dявляются э к з е м п л я р а м и к а к и х - т о п о д к л а с с о в B i r d , н о н е и м е е т с я н и о д н о г о э к з е м п л я р акласса B i r d .
Т а к ч т о ж е т а к о е п т и ц а ? Э т о в с е г д а к а к о й - т о к о н к р е т н ы й в и д — п и н г в и н ,курица или, к п р и м е р у , с т р а у с .Различные т и п ы п т и ц и м е ю т м н о ж е с т в о о б щ и х с в о й с т в ( в п р о т и в н о м случае о н и б ы н ебыли птицами), но н е т д в у х т и п о в , у к о т о р ы х бы о б щ и м и б ы л и в с е с в о й с т в а . Е с л и бы т а к и етипы были, о н и б ы л и б ы о д и н а к о в ы м и т и п а м и , н и ч е м н е о т л и ч а ю щ и м и с я д р у г о т д р у г а .Разложение классовЛюди с и с т е м а т и з и р у ю т о б ъ е к т ы , в ы д е л я я и х о б щ и е ч е р т ы . Ч т о б ы у в и д е т ь , к а к э т оработает,рассмотримдвакласса—HighSchoolиUniversity,показанныенарис.
13.1. З д е с ь д л я о п и с а н и я к л а с с о в и с п о л ь з о в а н У н и ф и ц и р о в а н н ы й Я з ы к М о д е л и р о вания (Unified M o d e l i n g L a n g u a g e , U M L ) , г р а ф и ч е с к и й я з ы к , о п и с ы в а ю щ и й к л а с с ы и и хвзаимоотношения д р у г с д р у г о м .П о м н и т е — м а ш и н а Я В Л Я Е Т С Я т р а н с п о р т н ы м средством, н о С О Д Е Р Ж И Т м о т о р .tКак в и д н о на р и с . 1 3 . 1 , у ш к о л ы и у н и в е р с и т е т а м н о г о о б щ и х с в о й с т в . И у ш к о л ы ,и у университета и м е е т с я о т к р ы т ы й м е т о д E n r o l l ( )(зачисления в у ч е б н о е з а в е д е н и е ) .для добавления объекта S t u d e n tОба класса имеют закрытый член n u m S t u d e n t s ,в котором х р а н и т с я ч и с л о у ч а щ и х с я .
Е щ е о д н о о б щ е е с в о й с т в о — в з а и м о о т н о ш е н и я учащихся и у ч е б н ы х з а в е д е н и й : в у ч е б н о м з а в е д е н и и м о ж е т б ы т ь м н о г о у ч а щ и х с я , в то в р е м яГлава 13. Полиморфизм297к а к о д и н у ч а щ и й с я у ч и т с я о д н о в р е м е н н о т о л ь к о в о д н о м у ч е б н о м з а в е д е н и и .
Само соб о й , и м е е т с я м а с с а д р у г и х с в о й с т в у ч е б н ы х з а в е д е н и й , но д л я д а н н о г о р а с с м о т р е н и я ограничимся перечисленным.Рис.13.1.UML-описаниеклассовHighSchoolиUniversityВ д о п о л н е н и е к с в о й с т в а м ш к о л ы у н и в е р с и т е т с о д е р ж и т м е т о д G e t G r a n t ()и член-данные nAvgSAT.Р и с . 13.1 к о р р е к т н о о т о б р а ж а е т с и т у а ц и ю , н о б о л ь ш а я ч а с т ь и н ф о р м а ц и и дублируетс я .
У м е н ь ш и т ь д у б л и р о в а н и е м о ж н о , е с л и п о з в о л и т ь к л а с с у U n i v e r s i t y унаследоватьб о л е е п р о с т о й к л а с с H i g h S c h o o l , к а к п о к а з а н о н а р и с . 13.2.Рис.13.2.HighSchoolversity,ныеНаследованиеупрощаетнокласспривноситклассаUni-определенпроблемыК л а с с H i g h S c h o o l о с т а е т с я н е и з м е н н ы м , н о к л а с с U n i v e r s i t y п р и э т о м прощео п и с а т ь . М о ж н о с к а з а т ь , ч т о U n i v e r s i t y — э т о к л а с с H i g h S c h o o l с ч л е н о м nAvgSAT и м е т о д о м G e t G r a n t ( ) .