1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 63
Текст из файла (страница 63)
М е т о д C o m p a r e T o Осравнивает студентовюуспеваемости, ч т о п р и в о д и т к с о о т в е т с т в у ю щ е й с о р т и р о в к е и х с п и с к а . М е т о д G e t String () в о з в р а щ а е т и м я и у с п е в а е м о с т ь с т у д е н т а .Прочие м е т о д ы к л а с с а S t u d e n t в к л ю ч а ю т с в о й с т в а т о л ь к о д л я ч т е н и я N a m e и G r a d e ,простой конструктор и м е т о д C r e a t e S t u d e n t L i s t ( ) . П о с л е д н и й м е т о д п р о с т о возвра<ает фиксированный с п и с о к с т у д е н т о в .Класс B i r d в н и з у л и с т и н г а т а к ж е р е а л и з у е т и н т е р ф е й с ыIComparable и IDisplayable.
О н р е а л и з у е т м е т о д C o m p a r e T o ( ) , к о т о р ы й с р а в н и в а е т н а з в а н и я п т и ц посредством в с т р о е н н о г о м е т о д а с р а в н е н и я к л а с с а S t r i n g . Т а к и м о б р а з о м , в р е з у л ь т а т есортировки п о л у ч а е т с я с п и с о к п т и ц в а л ф а в и т н о м п о р я д к е . М е т о д G e t N a m e ( )простоИзвращает н а з в а н и е п т и ц ы .[(лава 14.
Интерфейсы и структуры321Теперь можно вернуться к функции M a i n (). Метод C r e a t e S t u d e n t L i s t () используется для получения несортированного списка, который сохраняется в массивеstudents.О б ы ч н о д л я и м е н к о л л е к ц и й о б ъ е к т о в , т а к и х к а к м а с с и в ы , используются с у щ ествительные.М а с с и в с т у д е н т о в с п е р в а п р е о б р а з у е т с я в м а с с и в c o m p a r a b l e O b j e c t s .
Это о т л ичаетсяотмассивов,использованныхранеевэтойкниге(восновномв главе 6" О б ъ е д и н е н и е д а н н ы х — к л а с с ы и м а с с и в ы " ) . Э т и м а с с и в ы б ы л и м а с с и в а м и объектомо п р е д е л е н н о г о к л а с с а , н а п о д о б и е м а с с и в а о б ъ е к т о в S t u d e n t , в то в р е м я как compar a b l e O b j e c t s п р е д с т а в л я е т с о б о й м а с с и в о б ъ е к т о в , р е а л и з у ю щ и х интерфейс IComp a r a b l e б е з о т н о с и т е л ь н о к к л а с с у , к о т о р о м у п р и н а д л е ж а т о б ъ е к т ы .
Использование и нт е р ф е й с а в к а ч е с т в е т и п а э л е м е н т о в м а с с и в а , т и п а п а р а м е т р а и л и в о з в р а щ а е м о г о значения — мощный метод повышения гибкости программы.МассивcomparableObj ectsпередаетсявстроенномум е т о д у A r r a y . Sort ( ) ,который и сортирует студентов по их успеваемости.З а т е м о т с о р т и р о в а н н ы й м а с с и в о б ъ е к т о в т и п а S t u d e n t п е р е д а е т с я локально определенномуметодуDisplayArray (),итеративнопроходящемуповсемэлементамм а с с и в а о б ъ е к т о в , к о т о р ы е р е а л и з у ю т м е т о д G e t S t r i n g ( ) .
Д л я в ы я с н е н и я количестваэ л е м е н т о в м а с с и в а и с п о л ь з у е т с я с в о й с т в о A r r a y . L e n g t h . З а т е м д л я к а ж д о г о объектав ы з ы в а е т с я м е т о д G e t S t r i n g ( ) , и е г о р е з у л ь т а т в ы в о д и т с я н а д и с п л е й с помощьюфункции W r i t e L i n e ( ) .Д а л е е п р о г р а м м а с о р т и р у е т и в ы в о д и т с п и с о к п т и ц . Н е с о м н е н н о , вы согласитесь, чтом е ж д у п т и ц а м и и с т у д е н т а м и н е т н и ч е г о о б щ е г о . О д н а к о к л а с с B i r d реализует интерфейс I C o m p a r a b l e путем сравнения названий птиц и интерфейс I D i s p l a y a b l e путем возврата названий птиц.О б р а т и т е в н и м а н и е , что ф у н к ц и я M a i n ()не в ы п о л н я е т п р е о б р а з о в а н и я типа массивап т и ц — в э т о м н е т н е о б х о д и м о с т и .
Э т о а н а л о г и ч н о с л е д у ю щ е м у ф р а г м е н т у исходного текста:classBaseClassclassclassSubclassProgram{}:BaseClass{}{publicpublics t a t i cs t a t i cvoidvoidSomeFunction(BaseClassAnotherFunction()be){}{Subclasssc=newSubclass();SomeFunction(sc);Здесь объект класса S u b c l a s sскольку S u b c l a s sм о ж е т б ы т ь п е р е д а н к а к о б ъ е к т B a s e C l a s s , поЯВЛЯЕТСЯ B a s e C l a s s .Аналогично, массив объектов B i r d может быть передан методу, ожидающему масс и в о б ъ е к т о в I C o m p a r a b l e , п о с к о л ь к у к л а с с B i r d р е а л и з у е т и н т е р ф е й с IComparable.Следующийвызов—D i s p l a y A r r a y ()— такжеполучаетмассивb i r d s безпреобразования типа, поскольку класс B i r d s реализует интерфейс I D i s p l a y a b l e .Вывод программы выглядит следующим образом:Часть V.
За базовыми классамиСортировкаспискаLisa100:Marge:85Bart:50Maggie:30Homer:0СортировкаBlueстудентовспискаптицjayCardinalI FinchHawkOrioleRobinSparrowНажмите<Enter>длязавершенияпрограммы. . . "И студенты, и п т и ц ы о т с о р т и р о в а н ы , к а ж д ы й с п и с о к — в с о о т в е т с т в и и со с в о и м критерием с о р т и р о в к и .Интерфейс м о ж е т " н а с л е д о в а т ь " м е т о д ы д р у г о г о и н т е р ф е й с а . Я и с п о л ь з у ю к а в ы ч к и ,поскольку э т о не и с т и н н о е н а с л е д о в а н и е , н е з а в и с и м о от т о г о , к а к о н о в ы г л я д и т .
В приведенном д а л е е ф р а г м е н т е к о д а п е р е ч и с л е н ы базовые интерфейсы,что очень напоминает указание б а з о в о г о к л а с с а .//ICompare// объекты,public-интерфейс,такиinterfaceкоторыйвыводитьICompareможетинформацию:какосравниватьсвоемзначенииIComparable{//intGetValue-возвращаетсобственноецелоезначениеGetValue();Интерфейс I C o m p a r e наследует т р е б о в а н и я п о р е а л и з а ц и и C o m p a r e T o ( )о т интерфейса I C o m p a r a b l e . К э т о м у добавляется т р е б о в а н и е о р е а л и з а ц и и м е т о д а G e t V a l u e ( ) .
Объект I C o m p a r e м о ж е т и с п о л ь з о в а т ь с я в качестве объекта I C o m p a r a b l e , п о с к о л ь к у по определению он реализует его т р е б о в а н и я . О д н а к о э т о не п о л н о е наследование в объектноориентированном С # - с м ы с л е этого слова. Здесь н е в о з м о ж е н н и к а к о й п о л и м о р ф и з м . К р о м етого, здесь н е п р и м е н и м ы о б ы ч н ы е о т н о ш е н и я м е ж д у к о н с т р у к т о р а м и .Н а с л е д о в а н и е и н т е р ф е й с о в б у д е т п р о и л л ю с т р и р о в а н о в д е м о н с т р а ц и о н н о й программе A b s t r a c t l n t e r f а с е в следующем разделе.Д л я р е а л и з а ц и и и н т е р ф е й с а к л а с с д о л ж е н р е а л и з о в а т ь в с е е г о м е т о д ы .
Однакоклассможет реализовать метод интерфейса как абстрактный метод( с а м о с о б о й , т а к о й к л а с с я в л я е т с я а б с т р а к т н ы м ) , к а к , н а п р и м е р , в приведенной далее демонстрационной программе.Глава 14. Интерфейсы и структуры323// A b s t r a c t l n t e r f а с е//абстрактным классомusingSystem;namespaceдемонстрируетреализациюинтерфейсаAbstractlnterfасе{// ICompare - интерфейс,который может к а к с р а в н и в а т ь// объекты,так и выводить собственное значениеp u b l i c i n t e r f a c e ICompare:IComparable//GetValueint}//////-возвращаетсобственноезначениекакintGetValue();BaseClass- реализует интерфейс ICompare,конкретный метод GetValue()и абстрактныйCompareTo()abstractpublicclassBaseClass:реализуяметодICompare{intnValue;publicBaseClass(intnlnitialValue){nValue=nlnitialValue;}//Реализация//сначалаpublicинтерфейсаконкретныйintICompare:методGetValue(){returnnValue;}//азатем? 7реализуетаострактнотоabstractpublic//Subclass//абстрактногоpublic^//-интерфейсCompareTo(objectбазовыйметодапомощиrightObject);класспутемперекрытияCompareToОSubclass:Передаемприме'тодаintЗавершаетclassICompareBaseClassзначение,полученноеконструктором,//конструктору базовогоклассаpublicSubclass(intnlnitialValue):base(nlnitialValue){}//CompareToIIвозвращает//другогоoverride324-реализуетуказание,илиpublicбольшеинтерфейслиодинIComparable;объектподклассанетintCompareTo(objectrightObject)Часть V.
За базовыми классамГлава 1BaseClassreturnpublicbeclasspublic=(BaseClass)rightObject;GetValue().CompareTo(be.GetValue());Programs t a t i cSubclassSubclassvoidsclsc2MyFunc ( s c l ,==Main(string[]newnewstrings)Subclass(10) ;S u b c l a s s (20) ;s c 2 ) ,-// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершения программы...");Console.Read();}// MyFunc-использует//интерфейсом//объектовpublicиs t a t i cICompareуказания,voidметод,дляпредоставленныйвыводакакойиззначенийнихMyFunc(ICompareдвухбольшеicl,ICompareic2){Console.WriteLine("Значение i c l равно{0}," +"aic2{l}",i c l . G e t V a l u e () ,i c 2 . G e t V a l u e ())•;strings;switch(icl.CompareTo(ic2)){cases0 :="равен";break;cases- 1 :="меньше" ;break;cases1:="больше";default:s = "непонятно";break;}Console .
W r i t e L i n e ("Объектicl{o}объектаfma 14. Интерфейсы и структурыic2".s) ;325И н т е р ф е й с I C o m p a r e о п и с ы в а е т к л а с с , к о т о р ы й м о ж е т с р а в н и в а т ь д в а объекта и п ол у ч а т ь их з н а ч е н и я . I C o m p a r e н а с л е д у е т т р е б о в а н и е р е а л и з а ц и и C o m p a r e T o () отт е р ф е й с а I C o m p a r a b l e , а к р о м е т о г о , д о б а в л я е т с о б с т в е н н ы й м е т о д G e t V a l u e (),торый возвращает целочисленное значение объекта.Несмотря на то что метод может вернуть значение объекта как i n t , GeTV a l u e ()н и ч е г о н е г о в о р и т о в н у т р е н н е м у с т р о й с т в е к л а с с а .
Генерация™целого значения может потребовать проведения сложных вычислений.К л а с с B a s e C l a s s реализует и н т е р ф е й с I C o m p a r e — к о н к р е т н ы й м е т о д GetValueв о з в р а щ а е т значение ч л е н а n V a l u e . О д н а к о м е т о д C o m p a r e T o ( ) , т р е б у е м ы й интерфейсаI C o m p a r e , объявлен как абстрактный.О б ъ я в л е н и е класса a b s t r a c t означает, что в н е м отсутствует реализация о д н о йи л и нескольких с в о й с т в — в р а с с м а т р и в а е м о м случае метода C o m p a r e T o ( ) . Р ел и з а ц и я этого м е т о д а о т л о ж е н а до подкласса д а н н о г о абстрактного класса.S u b c l a s s р е а л и з у е т м е т о д C o m p a r e T o ( ) , ч т о н е о б х о д и м о д л я т о г о , чтобы э т о ткласс был конкретным.Заметим, чтоSubclassавтоматически реализует интерфейсICompare нес м о т р я н а то, ч т о э т о н е с к а з а н о я в н о .
B a s e C l a s s о б е щ а е т реализовать методыI C o m p a r e , a S u b c l a s s Я В Л Я Е Т С Я B a s e C l a s s . Н а с л е д у я э т и методы, SubC l a s s автоматически удовлетворяет требованиям по реализации ICompare.Функция M a i n ()с о з д а е т д в а о б ъ е к т а к л а с с а S u b c l a s s с р а з л и ч н ы м и значенияма затем передает их функции M y F u n c ( ) . Метод M y F u n c ()объектовсинтерфейсомICompare.Функцияо ж и д а е т получения д в у хM y F u n c ()используетметодC o m p a r e T o () д л я п р и н я т и я р е ш е н и я о т о м , к а к о й из о б ъ е к т о в б о л ь ш е , а затем применяет метод G e t V a l u e ()для вывода "значений" этих двух объектов.Вывод этой программы достаточно короток:Значение i c l равно 10,a ic2 —Объектi c l меньшеобъектаic2Нажмите < E n t e r > для з а в е р ш е н и я20программы...И з г л а в ы 15, " О б о б щ е н н о е п р о г р а м м и р о в а н и е " , в ы у з н а е т е , к а к м о ж н о п и с а т ьобобщенные интерфейсы.С # о б л а д а е т о п р е д е л е н н о й д и х о т о м и е й п р и о б ъ я в л е н и и п е р е м е н н ы х .