Главная » Просмотр файлов » Г. Шилдт - С#4.0 Полное руководство

Г. Шилдт - С#4.0 Полное руководство (1160795), страница 121

Файл №1160795 Г. Шилдт - С#4.0 Полное руководство (Г. Шилдт - С#4.0 Полное руководство) 121 страницаГ. Шилдт - С#4.0 Полное руководство (1160795) страница 1212019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 121)

Уг' Это вполне допустимо как при наличии контравариантности, так и без нее. 1мусопггауагсеп1Г<й1рла> й1рланег = лен МуС1аяя<й1рЬа>(); О создать ссылку из интерфейса 1муСопггачагЭеп1Г<Ьеса> на объект типа МуС1аяя<Вега>.

О И зто вполне допустимо как при наличии контравариантности, так и без нее. 1Мусопггауагаепгр<вега> Вегапет = лен Мус1аяя<Вега>(); // Создать ссылку из интерфейса 1мусопггауагпеп1Г<Ъега> О на объект типа Мус1аяя<й1рла>. О *** Это вполне допустимо благодаря контравариантности.

*** 1мусопггауагоеп1Г<вега> Вегаяег2 = лен МуС1аяя<й1рЬа>(); Этот вызов допустим как при наличии контравариантности, так и без нее. Вегакет.БЬон(пем Вега())г Присвоить переменную й1рлакет переменной Вегакег. О *** Эта вполне допустимо благодаря кпнтравариантности. *** Вегаяег = й1рлакегг ВеСакег.ЯЬон(лен ВеСа())," Прежде всего, обратите внимание на создание двух переменных ссылочного типа 1муСопСгаЧагбеп1р, которым присваиваются ссылки на объекты класса МуС1аяя, где параметры типа совпадают с аналогичными параметрами в интерфейсных ссылках.

В первом случае используется параметр типа й1рЬа, а во втором — параметр типа веса. Зги объявления не требуют контравариантности и допустимы в любом случае. Далее создается переменная ссылочного типа 1мусоптгачагсеп1р<Веса>, но на этот раз ей присваивается ссылка на объект класса МуС1а я я<й1рЬа>. Эта операция вполне допустима, поскольку обобщенный тип т объявлен как контравариантный. 632 Часть!. Язык С() Как и следовало ожидать, следующая строка, в которой вызывается метод Ве гане 1.

ЯЛоы () с аргументом Веса, является вполне допустимой. Ведь Веса — это обобщенный тип'Т в классе МуС1авз<Вега> и в то же время аргумент в методе япоы () . В следующей строке переменная А1рлане г присваивается переменной Веьанег. Эта операция вполне допустима лишь в силу контравариантности. В данном случае переменная относится к типу МуС1азв<Веса>, а переменная А1рЛанег — к типу МуС1авз<А1рпа>.

Но поскольку А1рпа является базовым классом для класса Вега, то такое преобразование типов оказывается допустимым благодаря контравариантносги. Для того чтобы убедиться в необходимости контравариантности в рассматриваемом здесь примере, попробуйте удалить ключевое слово гп из объявления обобщенного типа Т в интерфейсе 1муСопсгауагбеп1Г, а затем попытайтесь скомпилировать приведенный выше код еще раз. В результате появятся ошибки компиляции. Ради большей наглядности примера вся рассмотренная выше последовательность операций собрана ниже в единую программу. Продемонстрировать контравариантность в обобщенном интерфейсе.

ивгпч Яувсещ; Это обобщенный интерфейс, поддерживагевпь контравариантность. риЫгс гпсегсасе 1мусопсгауагбеп1Г<гп Т> ( чо1д ЯЛон(Т оЬ)); ) 11 Реализовать интерфейс 1муСопсгаЧагбеп1Г. с1азв МуС1авв<Т> : 1муСопсгаЧагбеп1Г<Т> риЬ1гс чогд ЯЛоы(Т х) ( Сопво1е.нг1сеььпе(х); ) О Создать простую иерархию классов. с1авз А1РЛа ( роЫ1с очегггде вгггпо Тозсггпб() ( гесогп "Это объект класса А1рьа."; ) О ) с1ава Веса : А1рьа рпЫ1с очегггде всггпб Тозсггпд() ( геспгп "Это объект класса Веса."; ) О ) с1азв Чаггапсеоещо ( всаг1с чогд Магп() О создать ссылку из интерфейса гмусопггачагбеп1Г<А1рла> на объект типа МуС1взв<А1рьа>. О Это вполне допустимо как при наличии кантравариантности, так и без нее.

гмус г ч б 1Г<А1рла> Агрланег = мусга <Агрла> М; Создать ссылку из интерфейса 1мусопсгачагбеп1Г<Ьеса> О на объект типа МуС1авз<Веса>. // И зта вполне допустимо как при наличии контравариантности, Глава 18. Обобщения 633 так и без нее. 1нусопггауагоеп1Г<Вега> Вегаяег = пен Мус1аяя<Вега>() создать ссылку из интерфейса 1мусопсгачагсеп1Г<Ьеса> /! на объект типа МуС1аяя<А1рьа>. *** Это вполне допустимо благодаря контравариантности. *** 1Мусопггауагпеп1Г<Вега> Вегаяе12 = пен Мус1аяя<А1рьа>(); О Этот вызов допустим как при наличии контравариантности, так и без нее.

Вегаяес.знои(пен Вега()); О Присвоить переменную А1рьаяег переменной Вегакег. *** Это вполне допустимо благодаря контравариантности. *** Вегакег = А1рьакег) ВеоаРег .Бион (пен Веса () ); ) Выполнение этой программы дает следующий результат. Это объект класса Вега. Это объект класса Вега. Контравариантный интерфейс может быть расширен аналогично описанному выше расширению ковариантного интерфейса. Для достижения контравариантного характера расширенного интерфейса в его объявлении должен быть указан такой же параметр обобщенного типа, как и у базового интерфейса, но с ключевым словом ьп, как показано ниже.

рпш1с гпгеггасе 1Мусопггауагоеп1Г2<1п Т> : 1нусопггауагВеп1Г<Т> ( О Следует иметь в виду, что указывать ключевое слово ап в объявлении базового интерфейса не только не нужно, но и не допустимо. Более того, сам расширенный интерфейс 1мусопсгачагсеп1Г2 не обязательно должен быть контравариантным. Иными словами, обобщенный тип Т в интерфейсе 1МуСопггауагбеп1Г2 не требуется модифицировать ключевым словом 1п, разумеется, все преимущества, которые сулит контравариантносгь в интерфейсе 1мусопс дача гсеп, при этом будут утрачены в интерфейсе 1МуСопггауагбеп1Г2. Контравариантность оказывается пригодной только для ссылочных типов, а параметр контравариантного типа можно применять только к аргументам методов. Следовательно, ключевое слово 1п нельзя указывать в параметре типа, используемом в качестве возвращаемого типа.

Вариантные делегаты Как пояснялось в главе 15, ковариантность и контравариантность поддерживается в необобщенных делегатах в отношении типов, возвращаемых методами, и типов, указываемых при объявлении параметров. Начиная с версии СФ 4.0, возможности ковариантносги и контравариантности были распространены и на обобщенные делегаты. Подобные возможности действуют таким же образом, как было описано выше в отношении обобщенных интерфейсов. 634 Часть!. Язык С() Ниже приведен пример контравариантного делегата. // Объявить делегат, коитравариаитиый по отношению к обобщенному типу Т.

бе1ечасе Ьоо1 Бошеор<сп Т>(Т оЬ1); Этому делегату можно присвоить метод с параметром обобщенного типа Т или же класс, производный от типа Т. А вот пример ковариантного делегата. // Объявить делегат, ковариаитиый по отношению к обобщенному типу Т. бе1ечаСе Т Апосьегор<оис Т, Ч>(Ч оЬ1); Этому делегату можно присвоить метод, возвращающий обобщенный тип Т, или же класс, производный от типа Т. В данном случае Ч оказывается просто параметром инвариантного типа.

В следующем примере программы демонстрируется применение обоих разновидностей вариантных делегатов на практике. Продемонстрировать коивариаитиость и коитравариаиткость // в обобщенных делегатах. ияьпч Буясеш; // Объявить делегат, коитравариаитиый по атиошению к обобщенному типу Т. бе1едасе Ьоо1 Зошеор<ьп Т>(Т оЬ1); Объявить делегат, ковариаитиый по отношению к обобщенному типу Т. с(е1ечасе Т Апосьегор<оис Т, Ч>(Ч оЬ9); с1аяя А1рЬа ( риЬ11с Тпс Ча1 ( чеС; яеС; риЬ11с А1рьа(ьпС н) ( Ча1 = ч; ) с1аяя Веса : А1рьа риЬ11с ВеСа(тпС ч) : Ьаяе(ч) (.

) ) с1аяя ОепОе1ечаСеуаг1апсеоешо ( // Возвратить логическое значение Сгие, если значение // переменной оЬ).Ча1 окажется четным. ясасьс Ьоо1 1вЕчеп(А1рьа оЬТ) ( ТГ((оЬ).уа1 % 2) == 0) гесигп Сгие; гесигп Га1яе; ЯСасьс Вега СЬапде1С(А1РЬа ооз) ( геСигп пеи Веса(оЬЗ.Ча1 +2); ) ясасьс чо1б Иаьп() А1рьа оЬ9А = пеы А1РЬа(4); Веса оЬ)В = пеи Веса(9)) // Продемонстрировать сначала коитравариаитиость. // Объявить делегат зошеор<А1рьа> и задать дпя него метод 1якчеп. Зошеор<А1рна> сьесх1С = 1якчеп/ Глава 18. Обобщения 635 О Объявить делегат Бовеор<Веда>. Бовеор<вепа> сьесх1с21 О А теперь присвоить делегат Бовеор<А1рьа> делегату Бовеор<веса>.

УУ *'* Это допустимо только благодаря контравариантности. *** сдеск1С2 = сдеск1С( УУ Вызвать метод через делегат. Сопво1е.ыг1пеььпе(сдесХ1С2(оЬЗВ)) // Далее, продемонстрировать контравариантность. УУ Объявить сначала два делегата типа Апогдегор. О здесь возвращаемым типом является класс Вега, У! а параметром типа — класс А1рда. !! Обратите внимание на то, что для делегата вобтгу1С Л задается метод СЬапое1С. Апосдегор<Веса, А1рда> водлгу1С = СЬапде1Ю П Здесь возвращаемым типом является класс А1рда, /! а параметром типа — тот же класс А1рйа. Апопйегор<А1рда, А1рьа> вобтгут<2( // А теперь присвоить делегат вобьгу1С делегату пюбьгу1С2. *** Зто допустимо только благодаря ковариантности.

*** воп)11у1С2 = вобьгу1С; Вызвать метод и вывести результаты на экран. оЬЗА = пюс111у1С2(оЬЗА); Сопво1е.иг1пеъьпе(оЬ)й.уа1)( ) ) Выполнение этой программы приводит к следующему результату. Га1ве б Каждая операция достаточно подробно поясняется в комментариях к данной программе. Следует особо подчеркнуть, для успешной компиляции программы в объявлении обоих типов делегатов Бовеор апг) йпосбе гор должны быть непременно указаны ключевые слова ап и опс соответственно. Без этих модификаторов компиляция программы будет выполнена с ошибками из-за отсутствия неявных преобразований типов в означенных строках кода.

Создание экземпляров объектов обобщенных типов Когда приходится иметь дело с обобщениями, то нередко возникает вопрос: не приведет ли применение обобщенного класса к неоправданному раздуванию кода? Ответ на этот вопрос прост: не приведет. Дело в том, что в С)) обобщения реализованы весьма эффективным образом: новые объекты конструируемого типа создаются лишь по мере надобности. Этот процесс описывается ниже.

Характеристики

Тип файла
DJVU-файл
Размер
7,66 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6556
Авторов
на СтудИзбе
299
Средний доход
с одного платного файла
Обучение Подробнее