1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 62
Текст из файла (страница 62)
:) С е й ч а с г л а в н а я ц е л ь — о б е с п е ч и т ь п о н и м а н и е т о г о , к а к р а б о тает данная п р о г р а м м а .Создание собственного интерфейсаИнтерфейс I D i s p l a y a b l e у д о в л е т в о р я е т с я л ю б ы м к л а с с о м , к о т о р ы й с о д е р ж и т м е т о д G e t S t r i n g ( ) (и, с а м о с о б о й , о б ъ я в л я е т , ч т о о н р е а л и з у е т I D i s p l a y a b l e ) . G e t String ( )возвращает объект типа s t r i n g , который может быть выведен на экран(использованием W r i t e L i n e ( ) ://IDisplayable объект,interfaceIDisplayableреализующийметодGetStringO{// Возвращает с о б с т в е н н о еstring G e t S t r i n g O ;описание}Приведенный д а л е е к л а с с S t u d e n t р е а л и з у е т и н т е р ф е й с I D i s p l a y a b l e :class S t u d e n tprivatestprivate d o/ / Методыpublicstr:IDisplayableringsName;uble dGrade = 0.0;доступа только дляi n g Nameчтения{get{returnsName;}}publicdoubleGrade{get{returndGrade;}}// G e t S t r i n g - в о з в р а щ а е т// и н ф о р м а ц и и о с т у д е н т естроковоеpublic//{stringGetString()представлениеimplementstheinterfacestringstringsPadName = N a m e .
P a d R i g h t ( 9 ) ;11s = S t r i n g . F o r m a t ( {0} :{l:N0}",sPadName, G r a d e ) ;returns;[да 14. Интерфейсы и структуры315В ы з о в P a d R i g h t ( ) г а р а н т и р у е т , ч т о п о л е и м е н и б у д е т и м е т ь ширину н е м е н е е9 с и м в о л о в ( с п р а в а о т и м е н и п р и н е о б х о д и м о с т и б у д е т д о б а в л е н о необходимое к о л л ч ес т в о п р о б е л о в ) . Э т о д е л а е т в ы в о д н а э к р а н б о л е е п р и в л е к а т е л ь н ы м ( д а н н ы й вопроср а с с м а т р и в а л с я в г л а в е 9 , " Р а б о т а с о с т р о к а м и в С # " ) . { l : N 0 } г л а с и т : выводит ч а сс з а п я т ы м и ( и л и т о ч к а м и — в з а в и с и м о с т и от р е г и о н а л ь н ы х н а с т р о е к ) через каждые3 цифры. О означает — округлить дробную часть.С и с п о л ь з о в а н и е м п р и в е д е н н о г о о б ъ я в л е н и я м о ж н о н а п и с а т ь следующий ф р а г м е н т аисходного текста (полностью программа будет приведена позже):// D i s p l a y A r r a y вывод массива объектов,к о т о р ы е реализуют)// интерфейсIDisplayablepublics t a t i cvoid DisplayArray (IDisplayable []displayables):intlength =displayables.Length;f o r ( i n t i n d e x = 0;index < length;{}index++)IDisplayabledisplayable =displayables[index];Console.WriteLine("{0}",displayable.GetString()}П р и в е д е н н ы й м е т о д D i s p l a y A r r a y ( ) м о ж е т в ы в е с т и и н ф о р м а ц и ю о массиве л юб о г о т и п а , л и ш ь б ы е г о э л е м е н т ы о п р е д е л я л и м е т о д G e t S t r i n g ( ) .
В о т примере в ы в о д аописанной функции:HomerMargeBartLisaMaggie:::::0855010030Предопределенные интерфейсыА н а л о г и ч н о м о ж н о и с п о л ь з о в а т ь и н т е р ф е й с ы из с т а н д а р т н о й б и б л и о т е к и С#. Напрмер, С# определяет интерфейс I C o m p a r a b l e следующим образом:interface IComparable{// Сравнивает текущий объект с// е с л и текущий о б ъ е к т больше,// противном случаеintCompareTo(objectо);объектом- 1 , если' о ' ; возвращаетменьше, и 0 в1,}Класс реализует интерфейс I C o m p a r a b l e путем реализации метода СотрагеТоиН а п р и м е р , S t r i n g р е а л и з у е т э т о т м е т о д п у т е м с р а в н е н и я д в у х с т р о к .
Е с л и строки и мт и ч н ы , м е т о д в о з в р а щ а е т 0. Е с л и с т р о к и р а з л и ч н ы , м е т о д в о з в р а щ а е т л и б о 1, либо ав зависимости от того, какая из строк " б о л ь ш е " .Как ни странно,ноотношениесравненияможнозадатьидляобъектов т аS t u d e n t -— например, по их успеваемости.Реализация метода C o m p a r e T o ()п р и в о д и т к т о м у , ч т о о б ъ е к т ы м о г у т быть oralт и р о в а н ы .
Е с л и о д и н с т у д е н т " б о л ь ш е " д р у г о г о , и х м о ж н о у п о р я д о ч и т ь о т "меньше!к " б о л ь ш е м у " . Н а с а м о м д е л е в к л а с с е A r r a y у ж е р е а л и з о в а н с о о т в е т с т в у ю щ и й метод:!Array.Sort(IComparable[]316objects);Часть V. За базовыми класса*Этот метод с о р т и р у е т м а с с и в о б ъ е к т о в , к о т о р ы е р е а л и з у ю т и н т е р ф е й с I C o m p a r a ble. Не имеет з н а ч е н и я , к к а к о м у к л а с с у в д е й с т в и т е л ь н о с т и п р и н а д л е ж а т о б ъ е к т ы —пример, это м о г у т б ы т ь о б ъ е к т ы S t u d e n t .
К л а с с A r r a y м о ж е т с о р т и р о в а т ь с л е д у ю щую версию S t u d e n t ://Student - о п и с а н и е с т у д е н т а// успеваемостиclass S t u d e n t :IComparableprivatedoubleсиспользованиемименииdGrade;/ / Методы д о с т у п аpublic double Grade{get { return dGrade; }}толькодлячтения// CompareTo - с р а в н е н и е д в у х с т у д е н т о в ;// у с п е в а е м о с т ь ю " б о л ь ш е "public i n tCompareTo ( o b j e c trightObject)студентслучшей{Student l e f t S t u d e n t = t h i s ;Student r i g h t S t u d e n t =(Student) rightObject ;// Возвращаем 16 -1 и л и 0 в з а в и с и м о с т и от в ы п о л н е н и я// к р и т е р и я с о р т и р о в к иif ( r i g h t S t u d e n t .
G r a d e < l e f t S t u d e n t . G r a d e ){return- 1 ;}if(rightStudent.Grade>leftStudent.Grade){return1 ;}return0;Сортировка м а с с и в а о б ъ е к т о в S t u d e n t с в о д и т с я к е д и н с т в е н н о м у в ы з о в у :id MyFunction ( S t u d e n t [] s t u d e n t s )/ / Сортировка м а с с и в аArray.Sort ( s t u d e n t s ) ;объектовIComparableВаше дело — о б е с п е ч и т ь к о м п а р а т о р ; A r r a y с д е л а е т в с е о с т а л ь н о е с а м .Сборка воединоИ вот наступил д о л г о ж д а н н ы й м о м е н т : п о л н а я п р о г р а м м а S o r t I n t e r f a c e ,использующая описанные ранее возможности.[Sortlnterfасе - демонстрационная программаилюстрирует к о н ц е п ц и ю и н т е р ф е й с аusing S y s t e m ;ш 14.
Интерфейсы и структурыSortlnterfасе317namespaceSortlnterfасе{//IDisplayable//информациюinterfaceо-Объект,себевкоторыйстроковомможетпредставитьформатеIDisplayable{// G e t S t r i n g - в о з в р а т//об объектеstringG e t S t r i n g O ;строки,представляющейинформации}classProgram{publics t a t i cvoidMain(string []args){// Сортировка студентов по успеваемости...Console.WriteLine("Сортировкаспискастудентов");// Получаем несортированный список студентовStudent[]students = Student.CreateStudentList();// Используем//массиваIComparable[]интерфейсIComparableдлясортировкиcomparableObjects =(IComparable[])students;Array.Sort(comparableObjects);// Теперь интерфейсI D i s p l a y a b l e выводит результатI D i s p l a y a b l e []displayableObjects=(IDisplayable[])students;DisplayArray(displayableObjects);// Теперь отсортируем массив птиц по именис// и с п о л ь з о в а н и е м той же процедуры ,хотя классы// и S t u d e n t не имеют общего б а з о в о г о к л а с с аConsole.WriteLine("\пСортировка списка птиц");Bird[]birds = Bird.CreateBirdList();Bird// Обратите внимание на отсутствие необходимости// явного преобразования типа о б ъ е к т о в .
. .Array.Sort(birds);DisplayArray(birds);/ / Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершения программы.. . " ) ;Console.Read();}// D i s p l a y A r r a y вывод массива// интерфейсIDisplayablepublics t a t i cvoid318объектов,реализующихЧасть V. За базовыми классаD i s p l a y A r r a y [ I D i s p l a y a b l e [] d i s p l a y a b l e s ){intlength =displayables.Length;f o r ( i n t i n d e x = 0;index < length;index++){IDisplayabledisplayableConsole.WriteLine("{0}",=displayables[index];displayable.GetString());//S t u d e n t s - с о р т и р о в к а по у с п е в а е м о с т и// S t u d e n t - о п и с а н и е с т у д е н т а с и с п о л ь з о в а н и е м и м е н и// у с п е в а е м о с т иclassStudent:IComparable,иIDisplayable(privateprivatestringdoublesName;dGrade=0.0;// Конструктор - и н и ц и а л и з а ц и я н о в о г о о б ъ е к т аpublic S t u d e n t ( s t r i n g sName,double dGrade)this.sName = sName;this.dGrade = dGrade;// C r e a t e S t u d e n t L i s t - для п р о с т о т ы// фиксированный с п и с о к с т у д е н т о вstatic s t r i n g []sNames ={"Homer",staticdoublet]publicstatic"Marge",dGrades"Bart",=S t u d e n t []{0,85,простосоздаем"Lisa",50,"Maggie"};100,30};C r e a t e S t u d e n t L i s t (){Student[]s A r r a y = new S t u d e n t [ s N a m e s .
L e n g t h ] ;for ( i n t i = 0; i < s N a m e s . L e n g t h ; i + + ){sArrayti]=newStudent(sNames[i],dGrades[i]);}returnsArray;/ / Методы д о с т у п а т о л ь к оpublic s t r i n g N a m eget{publicgetreturndouble{returnsName;длячтения}GradedGrade;}//Реализация интерфейса I C o m p a r a b l e :// CompareTo - с р а в н е н и е д в у х о б ъ е к т о вю 14. Интерфейсы и структуры(внашемслучае—319//объектов//долженpublicтипаидтиintStudent)раньшевивыяснениетого,отсортированномCompareTo(objectчтоизнихспискеrightObject){// Сравнение текущего S t u d e n t( н а з о в е м е г о левым) и// другого(назовем е г о правым)и г е н е р а ц и я ошибки,// если эти объекты — не S t u d e n tStudent leftStudent = t h i s ;if(!(rightObjectisStudent)){Console.WriteLine("Компараторуr e t u r n 0;переданнеStudent")}StudentrightStudent0=////Генерируем - 1 ,сортировкиif(rightStudent.Grade(Student)rightObject;или1наоснованиикритерия<leftStudent.Grade)>leftStudent.Grade){return- 1 ;}if{(rightStudent.Gradereturnreturn1;0,}// Реализация интерфейса IDisplayable:// G e t S t r i n g - возвращает строковое представление// информации о с т у д е н т еpublicstringGetStringО{stringsPadNamestringsreturn}==Name.
P a d R i g n t ( У ) ;String.Format("{o}:{l:N0}",sPadName,Grade)s;}//Birds// Bird class Bird-сортировкаптицпоименамj u s t an a r r a y of b i r d names:IComparable,IDisplayable{private//stringКонструкторpublicsName;-инициализацияBird(stringобъектаBirdsName){this.sName=sName;}320//CreateBirdList//используем-возвращаетфиксированныйсписокптиц;дляпростота]списокЧасть V. За базовым шstatic{s t r i n g []sBirdNames"Oriole","Hawk","Bluejay",publics t a t i c"Finch",Bird[]="Robin","Cardinal","Sparrow"};CreateBirdList (){Bird[]'birdsfor(inti==0;newBird[sBirdNames.Length];ibirds.Length;<i++){birds[i]=newBird(sBirdNames[i]);}returnbirds;/ / Методы д о с т у п а т о л ь к оp u b l i c s t r i n g Nameget{returnsName;длячтения}// Реализация интерфейса I C o m p a r a b l e :// CompareTo - с р а в н е н и е имен п т и ц ; и с п о л ь з у е т с я// встроенный метод сравнения класса S t r i n gpublicintCompareTo(objectrightObject){// Сравнение текущего B i r d(назовем// другого(назовем е г о правым)Bird l e f t B i r d =t h i s ;Bird r i g h t B i r d =(Bird)rightObject;returnString.Compare(leftBird.Name,еголевым)иrightBird.Name);// Реализация интерфейса I D i s p l a y a b l e :// G e t S t r i n g - в о з в р а щ а е т с т р о к у с и м е н е мpublicstring GetString()птицы{returnName,-Класс S t u d e n t ( п р и м е р н о в с е р е д и н е л и с т и н г а ) р е а л и з у е т и н т е р ф е й с ы I C o m p a r a ble и I D i s p l a y a b l e , к а к о п и с а н о р а н е е .