1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 60
Текст из файла (страница 60)
Объектно-ориентированное программироватьКаждая и з в е р с и й м е т о д а T e s t Ов ы з ы в а е т W i t h d r a w ()с точки зрения различногокласса объекта.Вывод п р о г р а м м ы и м е е т с л е д у ю щ и й в и д :ПередачаBankAccountв Test(BankAccount)вызываетBankAccount.Withdraw()1ередачаSavingsAccountвTest(BankAccount)вызываетSavingsAccount.Withdraw()вTest(SavingsAccount)вызываетSavingsAccount.Withdraw()ПередачаSpecialSaleAccountв Test(BankAccount)вызывает SavingsAccount.Withdraw()вTest(SavingsAccount)вызываетSavingsAccount.Withdraw()в Test(SpecialSaleAccount)вызывает SpecialSaleAccount.Withdraw()ПередачаSaleSpecialCustomerв Test(BankAccount)вызываетSavingsAccount.Withdraw()в Test(SavingsAccount)вызывает SavingsAccount.Withdraw()в Test(SpecialSaleAccount)вызывает SaleSpecialCustomer.Withdraw()вTest(SaleSpecialCustomer)НажмитевызываетSaleSpecialCustomer.Withdraw()<Enter> для завершения программы...Полужирным ш р и ф т о м в ы д е л е н ы с т р о к и , п р е д с т а в л я ю щ и е о с о б ы й и н т е р е с .
К л а с с ыBankAccount и S a v i n g s A c c o u n t р а б о т а ю т в т о ч н о с т и т а к , к а к и о ж и д а л о с ь . О д н а к опри вызове T e s t ( S a v i n g s A c c o u n t )CustomerпередаютсякакиSpecialSaleAccount,SavingsAccount.Втоtomer при п е р е д а ч е в T e s t ( S p e c i a l S a l e A c c o u n t )жевремяиSaleSpecialSaleSpecialCusработает как наследник этогопасса, т.е. ф а к т и ч е с к и с о з д а е т с я н о в а я и е р а р х и я н а с л е д о в а н и я .Создание новой иерархииЗачем С# п о д д е р ж и в а е т с о з д а н и е н о в о й и е р а р х и и н а с л е д о в а н и я ? Н е у ж е л и о б ы ч н о г ополиморфизма н е д о с т а т о ч н о ?С# формировался к а к " с е т е в о й " я з ы к в т о м с м ы с л е , ч т о к л а с с ы п р и р а б о т е программы—и даже п о д к л а с с ы — м о г у т б ы т ь р а с п р е д е л е н ы п о с е т и И н т е р н е т .
Т о е с т ь программа, к о т о р у ю в ы п и ш е т е , м о ж е т н е п о с р е д с т в е н н о и с п о л ь з о в а т ь к л а с с ы и з стандартных х р а н и л и щ , р а с п о л о ж е н н ы х на д р у г и х к о м п ь ю т е р а х в И н т е р н е т е .Вы можете р а с ш и р я т ь к л а с с , з а г р у ж е н н ы й из И н т е р н е т а . П е р е к р ы т и е м е т о д о в стандартной, п р о т е с т и р о в а н н о й и е р а р х и и к л а с с о в м о ж е т п р и в е с т и к н е п р е д н а м е р е н н ы мзффектам. С о з д а н и е н о в о й и е р а р х и и к л а с с о в п о з в о л я е т в а ш и м п р о г р а м м а м пользоваться всеми п р е и м у щ е с т в а м и п о л и м о р ф и з м а б е з о п а с н о с т и р а з р у ш е н и я существующего кода.Глава 13.
Полиморфизм307Вы м о ж е т е р е ш и т ь , ч т о п о с л е д у ю щ и е п о к о л е н и я п р о г р а м м и с т о в недостойны раяр я т ь н а п и с а н н ы й в а м и класс. З а б л о к и р о в а т ь его от в о з м о ж н ы х р а с ш и р е н и й можно nocgjс т в о м к л ю ч е в о г о с л о в а s e a l e d — т а к о й к л а с с не с м о ж е т в ы с т у п а т ь в качестве базовойРассмотрим следующий фрагмент исходного текста:usingSystem;publicclassBankAccount{//////W i t h d r a w a l - вы м о ж е т е с н я т ь со с ч е т а любую сумму,превышающую б а л а н с . В о з в р а щ а е т р е а л ь н о с н я т у ю с ос ч е т а суммуv i r t u a lpublicvoidWithdraw(decimalнеmWithdraw){Console.WriteLine("ВызовBankAccount.Withdraw()");}}publicsealedclassSavingsAccount:BankAccount{overridepublicvoidWithdraw(decimalmWithdrawal){C o n s o l e .
W r i t e L i n e ( "ВызовS a v i n g s A c c o u n t . W i t h d r a w ()11) ;}}publicclassSpecialSaleAccount:SavingsAccount{overridepublicvoidWithdraw(decimalmWithdrawal){Console.WriteLine("Вызов " +11" S p e c i a l S a l e A c c o u n t . W i t h d r a w ()) ;}}П р и к о м п и л я ц и и д а н н о г о и с х о д н о г о т е к с т а в ы п о л у ч и т е с л е д у ю щ е е сообщениеошибке:'SpecialSaleAccount''SavingsAccount':cannotinheritfromsealedclassК л ю ч е в о е с л о в о s e a l e d д а е т в о з м о ж н о с т ь з а щ и т и т ь к л а с с о т вмешательства м е т од о в н е к о т о р ы х п о д к л а с с о в . Н а п р и м е р , п о з в о л я я п р о г р а м м и с т у р а с ш и р я т ь класс, реалз у ю щ и й с и с т е м у б е з о п а с н о с т и , в ы , п о с у т и , р а з р е ш а е т е с о з д а т ь ч е р н ы й х о д , минующийэту систему.О п е ч а т ы в а н и е к л а с с а з а щ и щ а е т д р у г и е п р о г р а м м ы , в о з м о ж н о , н а х о д я щ и е с я где-тоИ н т е р н е т е , о т п р и м е н е н и я м о д и ф и ц и р о в а н н о й в е р с и и в а ш е г о к л а с с а .
Удаленная п р ог р а м м а м о ж е т и с п о л ь з о в а т ь к л а с с т а к и м , к а к о в о н е с т ь , и л и н е п р и м е н я т ь его вообщен о н е м о ж е т н а с л е д о в а т ь е г о с т е м , ч т о б ы и с п о л ь з о в а т ь т о л ь к о е г о ч а с т ь , перекрыв п р очие методы.308Часть IV. Объектно-ориентированное программировалЧасть VЗа базовыми классамиВ а ш и объекты до сих пор были п р о с т ы м и в е щ а м и наподобие целыхчисел или строк, в крайнем случае — счетов B a n k A c c o u n t . Но в С#и м е ю т с я и д р у г и е о б ъ е к т ы . И з э т о й ч а с т и в ы у з н а е т е , к а к п и с а т ь собственные объекгы типов-значений (работающие подобно типам i n tили f l o a t ) , и познакомитесь с интерфейсами, которые позволяютс д е л а т ь в а ш и о б ъ е к т ы б о л е е о б о б щ е н н ы м и и г и б к и м и .
В м е с т е с абс т р а к т н ы м и к л а с с а м и , р а с с м о т р е н н ы м и в г л а в е 13, " П о л и м о р ф и з м " ,и н т е р ф е й с ы п р е д о с т а в л я ю т к л ю ч к п е р е д о в ы м м е т о д а м проектирования программ. Так что читайте внимательно!Однако интерфейсы — не единственный способ сделать обобщенныйи г и б к и й к о д .
Н о в ы е в о з м о ж н о с т и С # п о з в о л я ю т с о з д а в а т ь обобщенные(generic)объекты—например,контейнеры,вкоторыхмогутхраниться различные д а н н ы е других типов. П о к а что это звучит длявас с п л о ш н о й абстракцией, но к концу части абстракция наполнитсяконкретным содержанием, так что запаситесь терпением.Глава 14Интерфейсы и структурыОтношение М О Ж Е Т _ И С П О Л Ь З О В А Т Ь С Я _ К А КОпределение и н т е р ф е й с аИспользование и н т е р ф е й с а д л я в ы п о л н е н и я р а с п р о с т р а н е н н ы х о п е р а ц и йОпределение с т р у к т у р ыИспользование с т р у к т у р ы д л я о б ъ е д и н е н и я к л а с с о в , и н т е р ф е й с о в и в с т р о е н н ы х т и п о вв одну иерархию к л а с с о власе может с о д е р ж а т ь с с ы л к у на д р у г о й к л а с с .
Э т о — п р о с т о е о т н о ш е н и е СОДЕРЖИТ. О д и н к л а с с м о ж е т р а с ш и р я т ь д р у г о й к л а с с с п о м о щ ь ю н а с л е д о в а н и я .Ь—отношение Я В Л Я Е Т С Я . Интерфейсы С # р е а л и з у ю т е щ е о д н о ,не менее важноеяношение — М О Ж Е Т _ И С П О Л Ь З О В А Т Ь С Я _ К А К .Если вы хотите н а п и с а т ь п а м я т к у , вы м о ж е т е в з я т ь р у ч к у и о б р ы в о к б у м а г и , м о ж е т еЕпользоваться о р г а н а й з е р о м и л и с д е л а т ь э т о п о с р е д с т в о м с в о е г о к о м п ь ю т е р а . В с е э т иккты реализуют о п е р а ц и ю " н а п и с а т ь п а м я т к у " — T a k e A N o t e . И с п о л ь з у я м а г и ю нашедования, на я з ы к е С# э т о м о ж н о р е а л и з о в а т ь с л е д у ю щ и м о б р а з о м :::stract class ThingsThatRecord{abstractpublicvoidTakeANote ( s t r i n gsNote) ;}public class Pen : ThingsThatRecord{override public void TakeANote (string sNote){II .
. . Написание заметки ручкой . . .}}public class PDA : ThingsThatRecordoverrideII).public..приvoidTakeANote ( s t r i n gпомощиорганайзера.sNote).."}publicclassLaptop:ThingsThatRecord{overridepublicvoidTakeANote(stringsNote){II... еще каким-то образом . .
.}}Еслиключевоесловоabstractвассмущает—обратитеськглаве" П о л и м о р ф и з м " , з а п о я с н е н и я м и . Е с л и в а м н е п о н я т н о , ч т о т а к о е наследован и е — п е р е ч и т а й т е г л а в у 12, " Н а с л е д о в а н и е " .Р е ш е н и е с и с п о л ь з о в а н и е м н а с л е д о в а н и я в ы г л я д и т н е п л о х о д о т е х п о р , пока и н т е р е св ы з ы в а е т т о л ь к о о п е р а ц и я T a k e A N o t e ( ) .