1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 54
Текст из файла (страница 54)
О д н а к о э т о г о н е д о с т а т о ч н одля имитации о б ъ е к т о в р е а л ь н о г о м и р а .В е р н и т е с ь к г л а в е 12, " Н а с л е д о в а н и е " , е с л и в а м т р е б у е т с я о с в е ж и т ь с в о и знания о н а с л е д о в а н и и .Микроволновая п е ч ь п р е д с т а в л я е т с о б о й о п р е д е л е н н ы й т и п п е ч и , н о н е из-за внешнего вида, а п о т о м у ч т о о н а в ы п о л н я е т те же ф у н к ц и и , ч т о и л ю б а я п е ч ь . О н а м о ж е т выполнять и р я д д о п о л н и т е л ь н ы х ф у н к ц и й , но к а к м и н и м у м о н а д о л ж н а р е а л и з о в а т ь базовую функцию п е ч и — г о т о в и т ь з а к у с к и .
П р и э т о м в а с не д о л ж н о б е с п о к о и т ь , ч т о у н е евнутри, кто ее с д е л а л и к а к п р о д а в е ц с у м е л - т а к и в с у ч и т ь ее в а ш е й ж е н е по т а к о й ц е н е нараспродаже... Х о т я н е т , и м е н н о п о с л е д н е е н а в е р н я к а б е с п о к о и т вас б о л ь ш е в с е г о . . .Для о б ы ч н о г о п о т р е б и т е л я о т л и ч и я м и к р о в о л н о в о й п е ч и о т о б ы ч н о й н е т а к важны— лишь б ы о н и о б е м о г л и г о т о в и т ь л ю б и м ы е б л ю д а , н о е с л и в з г л я н у т ь н а э т осточки зрения п е ч и , т о э т и о т л и ч и я с т а н о в я т с я к р а й н е с у щ е с т в е н н ы , п о с к о л ь к у внутреннее у с т р о й с т в опечейсовершенноразлично.Мощьнаследованиязаключаетсявтом факте, ч т о п о д к л а с с н е о б я з а н н а с л е д о в а т ь к а ж д ы й м е т о д б а з о в о г о к л а с с а в т о мвиде, в к о т о р о м о н н а п и с а н .
П о д к л а с с м о ж е т н а с л е д о в а т ь с у т ь м е т о д а б а з о в о г о к л а с с апри полном о т л и ч и и е г о р е а л и з а ц и и .Как о п и с ы в а л о с ь в г л а в е 7 , " Ф у н к ц и и ф у н к ц и й " , д в е и л и б о л ь ш е е ч и с л о ф у н к ц и ймогут иметь о д и н а к о в ы е и м е н а — л и ш ь бы о т л и ч а л и с ь к о л и ч е с т в а и/или т и п ы их аргументов.Простейший случай перегрузки функцииДвефункции содинаковыми м е н е м н а з ы в а ю т с я перегруженными.А р г у м е н т ы ф у н к ц и и с т а н о в я т с я ч а с т ь ю е е р а с ш и р е н н о г о и м е н и (используемого ввнутренне), как показано в с л е д у ю щ е м фрагменте исходного текста:publicclassMyClass{public//s t a t i cНекоторыеpublic//s t a t i cs t a t i cvoids t a t i cAFunction(int)другиеvoidНекоторыеpublicAFunctionOдействияНекоторыеpublic//voidдействияAFunction(doubleдействия,voidотличныеMain(string[]d)отпервыхдвухargs)AFunction();AFunction(1);AFunction(2.0);}}C# в с о с т о я н и и р а з л и ч а т ь э т и м е т о д ы по их а р г у м е н т а м .
К а ж д ы й из в ы з о в о в в фун|ции M a i n () обращается к своей функции.В о з в р а щ а е м ы й т и п не я в л я е т с я ч а с т ь ю р а с ш и р е н н о г о и м е н и ф у н к ц и и , так чяв ы н е м о ж е т е и м е т ь д в е ф у н к ц и и , о т л и ч а ю щ и е с я т о л ь к о т и п а м и возвращаемойзначения.Различные классы, различные методыН е у д и в и т е л ь н о , ч т о к л а с с , к о т о р о м у п р и н а д л е ж и т ф у н к ц и я , т а к ж е с т а н о в и т с я часяее р а с ш и р е н н о г о имени.
Рассмотрим с л е д у ю щ и й фрагмент исходного текста:publicclassMyClass{publics t a t i cpublicvoidvoidAFunctionO;AMethod();}publicclassUrClass{publicpublics t a t i cvoid AFunctionO;void AMethod();}public284classProgramЧасть IV. Объектно-ориентированное программирован»publics t a t i cvoidMain(string[]args){UrClass.AFunction();//ВызовMyClass//функции-членаmcObject=ВызовстатическойфункцииMyClass.AMethod()newMyClass();mcObject.AMethod();Имя класса я в л я е т с я ч а с т ь ю р а с ш и р е н н о г о и м е н и ф у н к ц и и , т а к ч т о д л я С # о ч е в и д н о ,какую именно ф у н к ц и ю A F u n c t i o n ( ) и л и м е т о д A M e t h o d ( ) в ы з ы в а т ь в к а ж д о м конкретном случае.Сокрытие метода базового классаИтак, м е т о д о д н о г о к л а с с а м о ж е т п е р е г р у ж а т ь д р у г о й м е т о д т о г о ж е к л а с с а , е с л и использует д р у г и е а р г у м е н т ы .
М е т о д т а к ж е м о ж е т п е р е г р у ж а т ь м е т о д б а з о в о г о к л а с с а . Перегрузка м е т о д а б а з о в о г о к л а с с а и з в е с т н а к а к сокрытие м е т о д а .Предположим, в а ш б а н к п р о в о д и т н о в у ю п о л и т и к у , в с о о т в е т с т в и и с к о т о р о й с н я т и ес депозитного с ч е т а о т л и ч а е т с я о т д р у г и х т и п о в с н я т и я с о с ч е т а . П р е д п о л о ж и м д л я конкретности, ч т о к а ж д о е с н я т и е со с ч е т а о б х о д и т с я в к л а д ч и к у в с у м м у 1.50.При и с п о л ь з о в а н и и ф у н к ц и о н а л ь н о г о п о д х о д а в ы м о ж е т е р е а л и з о в а т ь э т у п о л и т и к упосредством п е р е м е н н о й - ф л а г а в к л а с с е , к о т о р ы й б ы у к а з ы в а л , п р и н а д л е ж и т л и о б ъ е к ттипу 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 .
В э т о м с л у ч а е м е т о д с н я т и я с о с ч е т а долг а проверять з н а ч е н и е ф л а г а , ч т о б ы в ы я с н и т ь , с л е д у е т л и с н и м а т ь д о п о л н и т е л ь н ы е.50, как п о к а з а н о в с л е д у ю щ е м ф р а г м е н т е и с х о д н о г о т е к с т а ,publicclassBankAccount{privatedecimalprivatebool// Начальныйбаланс// депозитнымpublicmBalance;isSavingsAccount;илиифлаг,указывающий,являетсялисчетнетBankAccount(decimalboolmlnitialBalance,isSavingsAccount){mBalance = m l n i t i a l B a l a n c e ;this.isSavingsAccount=isSavingsAccount;)publicdecimalWithdraw(decimalmAmount){// Е с л и с ч е т д е п о з и т н ы йif(isSavingsAccount)...{//...снимаемmBalance-=лишние1.5 01.50М,-}//ifДалее обычный код с н я т и я со с ч е т а(mAmountToWithdraw > mBalance){mAmountToWithdrawГлава 13.
Полиморфизм=mBalance;285mBalance -= mAmountToWithdraw;returnmAmountToWithdraw;}}classMyClass{publicvoidSomeFunction(){//СоздаемдепозитныйBankAccountba=newсчетBankAccount(0,t r u e ) ;}.}В а ш а ф у н к ц и я д о л ж н а у к а з ы в а т ь , к а к о й и м е н н о с ч е т с о з д а е т с я , п у т е м передачип о л н и т е л ь н о г о а р г у м е н т а к о н с т р у к т о р у B a n k A c c o u n t . К о н с т р у к т о р сохраняет ф а й лз а т е м и с п о л ь з у е м ы й в м е т о д е W i t h d r a w ( ) Для с н я т и я д о п о л н и т е л ь н о й с у м м ы 1.50.О б ъ е к т н о - о р и е н т и р о в а н н ы й п о д х о д с к р ы в а е т м е т о д W i t h d r a w ( ) базомг о к л а с с а B a n k A c c o u n t н о в ы м м е т о д о м с т е м ж е и м е н е м в классе S a ti n g s A c o o u n t , к а к п о к а з а н о в п р и в е д е н н о й д а л е е демонстрационнойпрограмме.// HidingWithdrawal - сокрытие метода// методом п о д к л а с с а с тем же именемusingSystem;namespaceбазовогоклассаHidingWithdrawal{//BankAccountpublicclass-базовыйбанковскийсчетBankAccount{protectedpublicpublicmlnitialBalance)mlnitialBalance;returndecimaldecimalif=decimal{publicmBalance;BankAccount(decimalmBalancegetdecimalBalancemBalance;}Withdraw(decimalmAmountToWithdraw(mAmountToWithdraw>=mAmount)mAmount;Balance){mAmountToWithdraw=Balance;}mBalance -= mAmountToWithdraw;returnmAmountToWithdraw;286Часть IV.
Объектно-ориентированное программирован®// S a v i n g s A c c o u n t-банковскийсчетсначислением// п р о ц е н т о вpublicclassSavingsAccount:BankAccount{public////decimalmlnterestRate;SavingsAccount - процентнаяч и с л о от 0 до 10 0publicSavingsAccount(decimaldecimal:ставкапередаетсякакmlnitialBalance,mlnterestRate)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=Balance+(Balance*mlnterestRate);// W i t h d r a w - со с ч е т а можно с н я т ь любую с у м м у ,не/ / превышающую б а л а н с ; ф у н к ц и я в о з в р а щ а е т с н я т у ю суммуpublicdecimalWithdraw(decimalmWithdrawal){// Дополнительное снятиеbase.Withdraw(1.5M);1.50// Теперь снимаем со с ч е т а к а к обычноreturnbase.Withdraw(mWithdrawal);publicclassProgram{publics t a t i cvoidMakeAWithdrawal(BankAccountba,decimalmAmount)ba.Withdraw(mAmount);}publics t a t i cvoidMain(string []args){BankAccountba;SavingsAccountsa;//Создаембанковскийсчет,снимаем100,выводим//результатba = new B a n k A c c o u n t ( 2 0 0 М ) ;ba.Withdraw(100M);// Делаем то же с д е п о з и т н ы м с ч е т о мs a = ne~w S a v i n g s A c c o u n t ( 2 0 0 М ,12);sa.Withdraw(lOOM);(пава 13.