1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 49
Текст из файла (страница 49)
Функция M a i n ()создает объект b e базового класса B a s e C l a s s и р ает с ним.КлассSubclassкласса B a s e C l a s sнаследуетсяотклассаBaseClassпутемпосле двоеточия в определении класса.размещения иSubclassполучаетч л е н ы к л а с с а B a s e C l a s s в к а ч е с т в е с о б с т в е н н ы х , а т а к ж е ч л е н ы , к о т о р ы е могут бв него добавлены. Функция M a i n ()262д е м о н с т р и р у е т , что S u b c l a s s и м е е т член-д'Часть 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 ()B o m e O t h e r M e t h o d ()Нажмите<Enter>длязавершенияпрограммы...Это потрясающеЛюди составляют о б ш и р н ы е с и с т е м ы , ч т о б ы б ы л о п р о щ е р а з б и р а т ь с я в т о м , ч т о ихокружает.
Тузик я в л я е т с я ч а с т н ы м с л у ч а е м с о б а к и , к о т о р а я о т н о с и т с я к с о б а к о о б р а з вым, входящим в с о с т а в м л е к о п и т а ю щ и х , и т.д. Т а к л е г ч е п о з н а в а т ь м и р .Если привестидругойпример,можносказать,чтостудентявляетсячеловеком(точнее, его ч а с т н ы м с л у ч а е м ) . П о с л е э т и х с л о в с р а з у с т а н о в и т с я и з в е с т н о д о в о л ь н омного о студентах (об а м е р и к а н с к и х , е с т е с т в е н н о ) . И з в е с т н о , ч т о о н и и м е ю т н о м е р а социального страхования, с л и ш к о м м н о г о с м о т р я т т е л е в и з о р и п о с т о я н н о м е ч т а ю т о с е к с е .Но известно все это п о т о м у , ч т о э т и с в о й с т в а п р и с у щ и в с е м л ю д я м .' В С # говорится, ч т о к л а с с 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 .Наконец,можно сказать, чтоStu-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).Нетнуждыначинать каждый н о в ы й п р о е к т с н у л я , е с л и м о ж н о в о с п о л ь з о в а т ь с я г о т о в ы м и п р о г р а м м ными к о м п о н е н т а м и .hm 12.
Наследование263С р а в н и м р а з р а б о т к у п р о г р а м м н о г о о б е с п е ч е н и я с д р у г и м и о б л а с т я м и человеческойд е я т е л ь н о с т и . М н о г и е ли п р о и з в о д и т е л и а в т о м о б и л е й н а ч и н а ю т проектировать новуюм о д е л ь с р а з р а б о т к и д л я э т о г о н о в ы х ш у р у п о в , б о л т о в и г а е к ? И д а ж е если это так,ч т о вы с к а ж е т е о р а з р а б о т к е н о в ы х м о л о т к о в , о т в е р т о к и п р о ч е г о инструментария? Кон е ч н о ж е н е т — п о в о з м о ж н о с т и п р и п р о е к т и р о в а н и и и с б о р к е н о в о й модели магам а л ь н о и с п о л ь з у ю т с я д е т а л и и ч а с т и с т а р о й — не т о л ь к о б о л т ы и г а й к и , но и крупнаузлы, такие как компрессоры или даже двигатели.Н а с л е д о в а н и е п о з в о л я е т н а с т р о и т ь у ж е и м е ю щ и е с я п р о г р а м м н ы е компоненты.
С т ар ы е к л а с с ы м о г у т б ы т ь а д а п т и р о в а н ы д л я п р и м е н е н и я в н о в ы х п р о г р а м м а х без внесенияв н и х к а р д и н а л ь н ы х и з м е н е н и й . С у щ е с т в у ю щ и й к л а с с н а с л е д у е т с я — с расширением егов о з м о ж н о с т е й — н о в ы м п о д к л а с с о м , к о т о р ы й с о д е р ж и т в с е н е о б х о д и м ы е добавленияи и з м е н е н и я . Е с л и б а з о в ы й к л а с с н а п и с а н к е м - т о и н ы м , у в а с м о ж е т п р о с т о не быть вом о ж н о с т и в н о с и т ь в н е г о и з м е н е н и я , и н а с л е д о в а н и е о к а з ы в а е т с я единственным способом его использования.Д а н н а я в о з м о ж н о с т ь т е с н о с в я з а н а с т р е т ь и м п р е и м у щ е с т в о м п р и м е н е н и я наследован и я .
П р е д с т а в и м с и т у а ц и ю , к о г д а в ы н а с л е д у е т е б а з о в ы й к л а с с . П о з ж е выясняется, ч т ов н е м и м е е т с я о ш и б к а , к о т о р у ю н у ж н о и с п р а в и т ь . Е с л и в ы м о д и ф и ц и р о в а л и класс д л яе г о п о в т о р н о г о и с п о л ь з о в а н и я , в ы д о л ж н ы в р у ч н у ю в н е с т и и з м е н е н и я и протестировавк а ж д о е п р и л о ж е н и е в о т д е л ь н о с т и .
П р и н а с л е д о в а н и и к л а с с а б е з в н е с е н и я измененийв о б щ е м с л у ч а е и с п р а в л я е т е т о л ь к о б а з о в ы й к л а с с , н е з а т р а г и в а я с а м и приложения.О д н а к о г л а в н о е п р е и м у щ е с т в о н а с л е д о в а н и я в т о м , ч т о о н о о п и с ы в а е т реальный м и ртаким, каков он есть.Банк поддерживает несколько типов счетов. Один из них — депозитныйс ч е т — о б л а д а е т в с е м и с в о й с т в а м и п р о с т о г о б а н к о в с к о г о с ч е т а плюс возм о ж н о с т ь н а к о п л е н и я п р о ц е н т о в . Т а к о е о т н о ш е н и е н а я з ы к е С # моделируе т с я в п р и в е д е н н о й д а л е е д е м о н с т р а ц и о н н о й п р о г р а м м е .
В е р с и я этой прог р а м м ы н а к о м п а к т - д и с к е в к л ю ч а е т н е к о т о р ы е и з м е н е н и я и з следующегор а з д е л а , т а к ч т о о н а н е с к о л ь к о о т л и ч а е т с я о т п р и в е д е н н о г о з д е с ь листинга.//SimpleSavingsAccount- реализациясчета SavingsAccount// как разновидности BankAccount;здесь не используются// виртуальные методы(о них б у д е т с к а з а н о в г л а в е 13)usingSystem;namespaceSimpleSavingsAccount{// BankAccount - модель банковского с ч е т а ,// номер и хранит текущий б а л а н сp u b l i c c l a s s BankAccount // t h e base c l a s sкоторыйимеет{// Номера с ч е т о в н а ч и н а ю т с я с 1000 и о б р а з у ю т//возрастающую последовательностьp u b l i c s t a t i c i n t nNextAccountNumber = 1000;// Номер с ч е т а и б а л а н с для каждого о б ъ е к т а с в о иpublicintnAccountNumber;publicdecimalmBalance;// I n i t - Инициализация счета очередным свободным// номером и конкретным начальным балансом(по умолчанию264Часть IV.
Объектно-ориентированное программирован// н о л ь )public v o i dInitBankAccount(){I n i t B a n k A c c o u n t (0) ;}publicvoidInitBankAccount(decimalmlnitialBalance){nAccountNumber = ++nNextAccountNumber;mBalance = m l n i t i a l B a l a n c e ;}// Свойство B a l a n c epublic d e c i m a l B a l a n c eget { return mBalance;}}// D e p o s i t - П о з в о л е н любой п о л о ж и т е л ь н ы йpublic v o i d D e p o s i t ( d e c i m a l mAmount)вклад{if(mAmount>0){mBalance+=mAmount;// Withdraw - можно с н я т ь не б о л е е т о г о , ч т о// счету; метод в о з в р а щ а е т снятую суммуpublic d e c i m a lWithdraw(decimalmWithdrawal)if(Balance<=mWithdrawal){mWithdrawal=//используется//BalanceимеетсянасвойствоBalance;}mBalance -= m W i t h d r a w a l ;return mWithdrawal;}// T o S t r i n g publicstringreturnстрока с информацией оToBankAccountString()String.Format("{0}{l:C}",nAccountNumber,// S a v i n g s A c c o u n t// п р о ц е н т о вpublicсостоянииclass-банковскийSavingsAccount:счетссчетаBalance);накоплениемBankAccount//Подкласс{public 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 до 100publicvoidпроцентнуюInitSavingsAccount(decimalставку,mlnterestRate){InitSavingsAccount(0,mlnterestRate);}publicvoidInitSavingsAccount(decimaldecimalm 12.