1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 61
Текст из файла (страница 61)
Ф у н к ц и я н а п о д о б и е п о к а з а н н о й далее R ec o r d T a s k ( ) м о ж е т и с п о л ь з о в а т ь м е т о д T a k e A N o t e ( ) д л я т о г о , ч т о б ы записать с п ис о к н е о б х о д и м ы х п о к у п о к в з а в и с и м о с т и от т о г о , к а к о е с р е д с т в о е с т ь у в а с п о д рукой:voidRecordTask(ThingsThatRecordthings){// Этот абстрактный метод р е а л и з о в а н во//которые наследуют ThingsThatRecordthings.TakeANote("Список покупок"),// ... и так далее ...всехклассах,}Однако это решение сталкивается с двумя большими проблемами.Первая проблема — фундаментальная. Д е л о в т о м , ч т о р е а л ь н о связать ручкуо р г а н а й з е р и к о м п ь ю т е р с о о т н о ш е н и е м Я В Л Я Е Т С Я н е в о з м о ж н о .
З н а н и е того, какр а б о т а е т р у ч к а , н е д а е т н и к а к и х с в е д е н и й о т о м , к а к з а п и с ы в а ю т информациюкомпьютер или органайзер.Вторая проблема чисто техническая. Г о р а з д о л у ч ш е о п и с а т ь L a p t o p как подк л а с с к л а с с а C o m p u t e r . Х о т я PDA т а к ж е м о ж н о н а с л е д о в а т ь о т т о г о ж е классаC o m p u t e r , этого нельзя сказать о классе Р е п . Вы м о ж е т е охарактеризовать pyчкукак некоторый тип M e c h a n i c a l W r i t e D e v i c e (механическое пишущее y c т р о йс т в о ) и л и D e v i c e T h a t S t a i n s Y o u r S h i r t ( у с т р о й с т в о , п а ч к а ю щ е е ваши штан ы ) . О д н а к о в С # к л а с с н е м о ж е т б ы т ь н а с л е д о в а н о т д в у х р а з н ы х классов о д н овременно — класс С# может быть в е щ ь ю только одного сорта.В е р н е м с я к т р е м и с х о д н ы м к л а с с а м .
Е д и н с т в е н н о е о б щ е е , ч т о у н и х есть —то,чтовсеонимогутиспользоватьсядлязаписичего-либо.Отношение МОЖ Е Т _ И С П О Л Ь З О В А Т Ь С Я _ К А К R e c o r d a b l e п о з в о л я е т с в я з а т ь и х пригодностьнекоторой цели без применения наследования.Описаниеинтерфейса выглядит оченьп о х о ж и м н а о п и с а н и е к л а с с а б е з членов-д а н н ы х , в к о т о р о м в с е м е т о д ы а б с т р а к т н ы . О п и с а н и е и н т е р ф е й с а д л я " в е щ е й , которыемогут записывать", может выглядеть следующим образом:312Часть V. За базовыми классамinterface IRecordable{voidTakeANote(stringsNote){Обратите в н и м а н и е н а к л ю ч е в о е с л о в о i n t e r f a c e т а м , г д е о б ы ч н о с т о и т к л ю ч е в о еслово c l a s s . В ф и г у р н ы х с к о б к а х и н т е р ф е й с а п р и в е д е н с п и с о к а б с т р а к т н ы х м е т о д о в .Интерфейсы не с о д е р ж а т о п р е д е л е н и я н и к а к и х ч л е н о в - д а н н ы х .Метод T a k e A N o t e ( )записан без реализации.
Ключевые слова p u b l i c и v i r t u a lни a b s t r a c t не являются необходимыми. Все методы интерфейса открыты, а сам онне включается ни в к а к о е о б ы ч н о е н а с л е д о в а н и е — э т о и н т е р ф е й с , а не к л а с с .Класс, к о т о р ы й реализует и н т е р ф е й с , д о л ж е н п р е д о с т а в и т ь р е а л и з а ц и ю д л я к а ж д о г озлемента и н т е р ф е й с а . М е т о д , р е а л и з у ю щ и й м е т о д и н т е р ф е й с а , н е и с п о л ь з у е т к л ю ч е в о еслово o v e r r i d e — э т о н е п о х о ж е н а п е р е к р ы т и е в и р т у а л ь н о й ф у н к ц и и .По соглашению имена интерфейсов начинаются с буквы I, Кроме того, дляних, как п р а в и л о , и с п о л ь з у ю т с я п р и л а г а т е л ь н ы е ( в т о в р е м я к а к д л я и м е н классов — с у щ е с т в и т е л ь н ы е ) .
К а к о б ы ч н о , э т о т о л ь к о с о г л а ш е н и е — С # с о в е р ш е н н о все р а в н о , к а к и м е н н о в ы н а з о в е т е в а ш и н т е р ф е й с .Далее п р и в е д е н ообъявление,указывающее,чтоклассPDA р е а л и з у е тинтерфейсIRecordable.publicclassPDA:IRecordable{publicvoidTakeANote ( s t r i n gsNote){II..Написание.памятки...Как видите, не существует о т л и ч и й м е ж д у с и н т а к с и с о м о б ъ я в л е н и я н а с л е д о в а н и я базового класса T h i n g s T h a t R e c o r d и о б ъ я в л е н и е м о р е а л и з а ц и и и н т е р ф е й с а I R e c o r d a b l e .В этом и з а к л ю ч а е т с я о с н о в н а я п р и ч и н а с о г л а ш е н и я об и м е н о в а н и и и н т е р ф е й сов — ч т о б ы с р а з у о т л и ч а т ь их от к л а с с о в .Вывод из всего с к а з а н н о г о — и н т е р ф е й с о п и с ы в а е т в о з м о ж н о с т и и с в о й с т в а .
К р о м еиго, он представляет с о б о й контракт. Е с л и вы с о г л а с н ы р е а л и з о в а т ь в с е м е т о д ы , определенные в и н т е р ф е й с е , вы п о л у ч и т е в с е е г о в о з м о ж н о с т и .Класс реализует и н т е р ф е й с , п р е д о с т а в л я я о п р е д е л е н и я в с е х м е т о д о в и н т е р ф е й с а , к а кпоказано в п р и в е д е н н о м д а л е е ф р а г м е н т е и с х о д н о г о т е к с т а ,public class Pen : IRecordable{publicvoidTakeANote ( s t r i n g.ЗаписьsNote){II..ручкой.
. .}Глава 14. Интерфейсы и структуры313}publicclassPDA.-ElectronicDevice,IRecordable{publicvoidTakeANote(stringsNote){//..Использование.органайзера...}}publicclassLaptop:Computer,IRecordable{public//{}voidTakeANote(stringЗ а п и с ь п р и помощиsNote)компьютера}К а ж д ы й из этих т р е х классов наследует с в о й б а з о в ы й класс, но реализует один и тот)и н т е р ф е й с I R e c o r d a b l e , у к а з ь ш а ю щ и й , ч т о к а ж д ы й и з т р е х классов м о ж е т использовандля н а п и с а н и я п а м я т к и с п р и м е н е н и е м м е т о д а T a k e A N o t e ( ) . Ч т о б ы понять, почемум о ж е т оказаться п о л е з н ы м , р а с с м о т р и м с л е д у ю щ у ю ф у н к ц и ю R e c o r d S h o p p i n g L i s t ( ]publicclassProgram{s t a t i c{}publicvoidRecordShoppingList(IRecordablerecordingObject)// Создание списка покупокstring sList= GenerateShoppingList();// Запись спискаrecordingObject.TakeANote(sList);publics t a t i cvoidMain(string []args){PDA p d a = n e w P D A ( ) ;RecordShoppingList(pda);}}Д а н н ы й ф р а г м е н т к о д а г л а с и т , ч т о ф у н к ц и я R e c o r d S h o p p i n g L i s t ( ) может п р инимать в качестве аргумента л ю б о й объект, р е а л и з у ю щ и й метод T a k e A N o t e () —говор я ч е л о в е ч е с к и м я з ы к о м , л ю б о й о б ъ е к т , к о т о р ы й в с о с т о я н и и з а п и с а т ь памятку.
Ф у н кц и я R e c o r d S h o p p i n g L i s t () не д е л а е т н и к а к и х п р е д п о л о ж е н и й о т о м , к а к о й в точкасти тип имеет r e c o r d i n g O b j e c t . Тот факт, что объект в действительности имеетPDA и л и E l e c t r o n i c D e v i c e , с о в е р ш е н н о н е в а ж е н , п о с к о л ь к у о н в состоянии з а п исать памятку.Э т о ч р е з в ы ч а й н о в а ж н о е с в о й с т в о , т а к к а к о н о о б е с п е ч и в а е т ф у н к ц и и RecordS h o p p i n g L i s t ()в ы с о к у ю с т е п е н ь о б о б щ е н н о с т и , а с л е д о в а т е л ь н о , и повторноп р и м е н е н и е в д р у г и х п р о г р а м м а х .
Э т о б о л е е в ы с о к а я с т е п е н ь о б щ н о с т и , ч е м при и сп о л ь з о в а н и и б а з о в о г о к л а с с а в к а ч е с т в е т и п а а р г у м е н т а , п о с к о л ь к у и н т е р ф е й с в какс т в е а р г у м е н т а п о з в о л я е т п е р е д а в а т ь п р а к т и ч е с к и п р о и з в о л ь н ы й о б ъ е к т , который м ож е т н е и м е т ь н и ч е г о о б щ е г о с д р у г и м и р а з р е ш е н н ы м и д л я и с п о л ь з о в а н и я объектамие с л и н е с ч и т а т ь р е а л и з а ц и и и н т е р ф е й с а .
Э т и о б ъ е к т ы м о г у т б ы т ь н и к а к н е связанобщей иерархией классов.314Часть V. За базовыми класса» Глава 1РассматриваемаядалеепрограммаSortInterfaceдемонстрируетприменениеописанных с в е д е н и й на п р а к т и к е .Для лучшего п о н и м а н и я я д о л ж е н р а з б и т ь п р о г р а м м у на н е с к о л ь к о ч а с т е й . Т а к я с м о гу более четко п р о д е м о н с т р и р о в а т ь п р и м е н е н и е о т д е л ь н ы х п р и н ц и п о в . Е с л и у м е н я вообще есть п р и н ц и п ы . . .