Главная » Просмотр файлов » И.Г. Головин, И.А. Волкова - Языки и методы программирования

И.Г. Головин, И.А. Волкова - Языки и методы программирования (1160773), страница 25

Файл №1160773 И.Г. Головин, И.А. Волкова - Языки и методы программирования (И.Г. Головин, И.А. Волкова - Языки и методы программирования) 25 страницаИ.Г. Головин, И.А. Волкова - Языки и методы программирования (1160773) страница 252019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Переопределение этих операцийпозволяет гибко управлять поведением объектов.Во-вторых, появляется возможность создания универсальныхклассов, в частности контейнеров, которые могут взаимодейство­вать с любыми объектами. Например, если в определении классаStack из гл. 7 изменить тип хранимых объектов с i n t на Obj ect,то стек будет в состоянии хранить значения любых объектов.

Этовозможно, поскольку в соответствии с правилами совместимостипроизводного и базового классов ссылке на базовый класс можноприсвоить значение ссылки на любой производный класс. Сле­довательно, ссылке на Object можно присвоить любую другуюссылку.Правда, что делать потом с этими ссылками? Ведь функция Pop ()тоже вернет ссылку на Object. Пусть у нас есть два класса: X и Y.Рассмотрим пример работы с классом Stack, объекты которогохранят ссылки на Object:Stack s = new Stack(32);s.Push(new X()); s.Push(new Y());124Y у = s.Pop(); // ошибка — несоответствие типовX х = s.Pop(); // ошибка — несоответствие типовОшибка возникает, так как нет неявного преобразования от ба­зового класса к производному.

Причем проблема не в том, что такоепреобразование не поддерживается, а в том, что такое неявное пре­образование небезопасно.Преобразовать ссылку базового класса Base в ссылку на произ­водный класс Derived можно только, если динамический тип ссылкиТ ковариантен производному классу Derived.Класс Т1 ковариантен классу Т2, если Т1 совпадает с Т2 илиявляется его наследником. Аналогично Т1 контравариантен классуТ2, если Т2 ковариантен Т1. Классы Т1 и Т2 инвариантны, если онине ковариантны и не контравариантны одновременно.В языках C# и Java есть операция явного преобразования ссылокиз класса X в класс Y (X и Y различны):(Y) XЭта операция имеет содержательный смысл (т. е.

выполняется вовремя работы программы), если Y ковариантен X. Если Y контрава­риантен X, то по определению Y является базовым для X, а любаяссылка на производный класс неявно преобразуема в базовый,поэтому компилятор проигнорирует это преобразование.

Нако­нец, если X и Y инвариантны, то компилятор выдаст сообщениеоб ошибке.Важнейшей особенностью операции преобразования ссылокв Java и C# является то, что она контролирует корректность преоб­разования. В случае если преобразование ссылок невозможно, тогенерируется исключение (см. гл. 9). Заметим, что в C++ операцияпреобразования ничего не контролирует. Есть вариант контроли­руемой операции, но он применим только к полиморфным классам(см. подразд. 8.2).По определению операция преобразования ссылки х типа Xв контравариантный тип Y корректна, если динамический тип хковариантен Y.Пустая ссылка null приводима в любой тип.Итак, чтобы пример со стеком компилировался, следует вставитьоперации преобразования:Y у = (Y)s.Pop ();X х = (X )s .P o p ();Оба языка содержат большой набор классов-контейнеров (кол­лекций), способных хранить любые объекты.

В Java они находят­ся в пакете java.util, в C# — в пространстве имен System.Collections.Однако вспомним, что наряду с классами в этих языках есть мас­сивы и типы значений. Если бы они не были совместимы с классом125Object, то полезность последнего была бы ограничена.

Заметим,что в некоторых объектно-ориентированных языках (например,SmallTalk) любое значение принадлежит некоторому классу (т. е. дажезначения простых типов являются экземплярами соответствующихклассов). Такой подход упрощает язык, но приводит к неэффектив­ности операций со значениями простых типов. Поэтому в C# и Javaпринят компромиссный подход: для эффективности выделены типызначений, а для общности (и удобства) введены понятия классовоболочек и операций преобразования между типами значенийи классами-оболочками. Эти операции называются упаковкой и рас­паковкой (boxing-unboxing).Классы-оболочки. Упаковка и распаковкаДля каждого простого типа данных в стандартной библиотекеимеется класс-оболочка.

Этот класс полезен в двух отношениях.Во-первых, он содержит набор методов, облегчающих работу с дан­ными простых типов. Например, класс оболочка Int32 для типаint в языке C# содержит методы, преобразующие значение в раз­личные виды текстового представления и обратно (Parse, TryParse,ToString).Во-вторых, компилятор умеет преобразовывать значения простыхтипов в экземпляры класса-оболочки (эта операция называется упа­ковкой) и обратно — из классов-оболочек в значения (эта операцияназывается распаковкой).В языке C# операция упаковки никак не обозначается и выпол­няется неявно:int i = 25;Object obj = i; // произошла упаковка// Чтобы узнать, в какой объект упаковано значение,// напечатаем имя типа объекта и текстовое// представлениеConsole.WriteLine(obj.GetType().FullName ++ob j .ToString());В этом случае будет напечатаноSystem.Int32 :25Распаковка имеет вид явной операции преобразования к типузначения (продолжение предыдущего примера):int j = (int)obj;Console.WriteLine(j);В этом случае будет напечатано 25.126В языке Java операция упаковки выглядит как создание объектакласса-оболочки, а операция распаковки — как в языке С#, т.

е. видявного приведения к типу оболочки:int i = 25;Object obj = Integer(i); // произошла упаковка// Чтобы узнать, в какой объект упаковано значение,// напечатаем имя типа объекта и текстовое// представлениеSystem.out.println(obj.getClass().getName() ++obj.toString());int j = (Integer)obj;System.out.println (j);В этом случае будет напечатаноjava.lang.Integer:2525Начиная с 2005 г. в Java поддерживаются операции автоупаковкии автораспаковки (в C# они были введены с самой первой версии).Автоупаковка означает, что операция упаковки выполняется авто­матически (иначе говоря, то, что в Java назвали автоупаковкой, в C#всегда называлось просто упаковкой):Object obj = 30;// (30) ;// вставлено: obj = new IntegerАвтораспаковка — это автоматическая распаковка из ссылки,объявленной как класс-оболочка, в значение соответствующего про­стого типа.В языке C# эти операции имеют видInt32 refInt = 32; // (авто)упаковкаint i = reflnt; // автораспаковкаа в языке JavaInteger reflnt = 32; // автоупаковкаint i = reflnt; // автораспаковкаВ языке C# классы-оболочки существуют для всех типов значений,в том числе для перечислений (System.

Enum). Структуры (они ведьтоже типы значений) тоже могут упаковываться и распаковыватьсяв объекты в динамической памяти в контексте, требующем ссылки.Классы-оболочки совместно с операциями автоупаковки и распа­ковки позволяют трактовать абсолютно все значения в программе какобъекты, но без потери эффективности при выполнении операцийс простыми типами данных.127Например, напишем пример работы с объектом класса Stack наязыке Java:Stack s = new Stack ();int [] x = {1,2,3,4,5,6,7};for (int k : x) s.Push(k);while (!s .IsEmpty ()) System.out.println(s.Pop ());double [] xx = {1.1,2.2,3.3,4.4,5.5,6.6,7.7};for (double k : xx) s.Push(k);while" (! s .IsEmpty () ) System.out.println(s.Pop());Видно, что стек действительно может хранить значения произ­вольных типов.Правда, упаковка и распаковка требуют определенных накладныхрасходов, однако появление обобщенных типов позволило исправитьэту проблему без ущерба для гибкости языка.Запрещение наследованияВ языках C# и Java есть возможность запрета наследования.Если класс в языке C# помечен модификатором sealed (в Java дляэтой цели служит модификатор final), то этот класс не может бытьбазовым ни для какого класса.

Например, классы-оболочки (см.подразд. 8.2), структуры, встроенный класс String не могут на­следоваться. Проектирование полиморфных иерархий — достаточнонетривиальное дело, поэтому некоторые авторы рекомендуют явнозакрывать свои классы для наследования, если они не проектируютсяспециально как иерархии (см. подразд. 8.3).Заметим, что закрытие класса для наследования может в неко­торых случаях увеличить эффективность вызова методов (см.

под­разд. 8.2).8.2. Динамический полиморфизмПонятие полиморфизма подразумевает наличие нескольких вари­антов реализации одной сущности. Виды полиморфизма различаютсяпо виду сущности и по способу связывания сущности с вариантомреализации.В рассматриваемых языках (C++, С#, Java) воплощена разно­видность статического полиморфизма, называемая перегрузкойфункций. При перегрузке имеется сущность — операция. Сущностьвыражается именем операции (например, операция «+» или методp r i n t l n ) . Набор вариантов ее реализации — различные вариантыодноименных функций в одной области видимости, различающиеся128профилем параметров.

Связывание вызова функции с вариантом еереализации происходит статически (транслятором) при сопостав­лении количества и типов фактических и формальных параметровв вызове и реализации функции.При динамическом полиморфизме сущностью является операцияили действие, выражаемое профилем метода класса, а вариантамиреализации — заместители метода в производных классах.В C++ и C# введено понятие виртуальных функций (методов).Механизм виртуальных методов заключается в том, что при вызовевиртуального метода через указатель или ссылку связывание вызоваметода с конкретной реализацией метода зависит от динамическоготипа указателя или ссылки и выполняется во время работы програм­мы.

Для невиртуальных методов связывание вызова с реализациейзависит от статического типа (поэтому неважно, как вызываетсяневиртуальный метод: через ссылку или объект) и происходит ста­тически.Тип данных (класс), содержащий хотя бы одну виртуальную функ­цию, называется полиморфным типом (классом), а объект этоготипа — полиморфным объектом.В языке Java нет термина «виртуальный метод», но только потому,что все методы в Java являются виртуальными, поэтому любой классязыка Java полиморфен.В языке C# есть как виртуальные, так и невиртуальные методы,при этом класс Object содержит виртуальные методы (например,ToString () и Finalize () ), поэтому обычные классы C# такжеполиморфны (за исключением статических классов).В C++ и C# виртуальность функции определяется описателемv i r t u a l перед объявлением метода.

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

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

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

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