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

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

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

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

Глава 11. Наследование 351 Ссылки на базовый класс и объекты производных классов Как вам должно быть уже известно, СФ является строго типизированным языком программирования. Помимо стандартных преобразований и автоматического продвижения простых типов значений, в этом языке строго соблюдается принцип совместимости типов. Это означает, что переменная ссылки на объект класса одного типа, как правило, не может ссылаться на объект класса другого типа. В качестве примера рассмотрим следующую программу, в которой объявляются два класса одинаковой структуры. /! Эта программа не подлежит компиляции. с1азз Х ( 1пс а; рцс11с Х(1пг ь) ( а = 1) ) с1азз У ( 1пг.

а; рцо11с т (ьпг 1) ( а = 1; ) с1аза 1псошраг1)огенет ( зсасьс тоьб Маго() ( Х х = пеи Х(10); Х х2; у = пен у(5); х2 = х; /! верно, поскольку оба объекта относятся к одному и тому же типу х2 = у; // ошибка, поскольку зто разнотипные объекты ) ) Несмотря на то что классы Х и у в данном примере совершенно одинаковы по своей структуре, ссылку на объект типа У нельзя присвоить переменной ссылки на объект типа Х, поскольку типы у них разные.

Поэтому следующая строка кода оказывается неверной и может привести к ошибке из-за несовместимости типов во время компиляции. х2 = у; О неверно, поскольку зто разнотипные объекты Вообще говоря, переменная ссылки на объект может ссылаться только на объект своего типа. Но из этого принципа строгого соблюдения типов в С(( имеется одно важное исключение: переменной ссылки на объект базового класса может быть присвоена ссылка на объект любого производного от него класса.

Такое присваивание считается вполне допустимым, поскольку экземпляр объекта производного типа инкапсулирует экземпляр объекта базового типа. Следовательно, по ссылке на объект базового класса можно обращаться к объекту производного класса. Ниже приведен соответствующий пример. 352 Часть!. Язык С() // По ссылке на объект базового класса можно обращаться // к объекту производного класса. ивгпч БувСещ; с1ааа Х роЬ11с ьпо а) роЬ11с Х(ьпг 1) ( а=1; ) с1ава У : Х ( рпЬ11с ьпс Ь; рнЬ11с Х(ьпс 1, ьпт. З) : Ьаве(9) ( Ь=1; .) ) с1авв Вавенет ( воао1с чо16 Магп() ( Х х = псы Х(10); Х х2; х у = лен т(5, б); х2 = х) // верно, поскольку оба объекта относятся к одному и тому же типу Сопао1е.ыгьпеъгпе("х2.а: " + х2.а); х2 = у; // тоже верно, поскольку класс т является производным от класса Х Сопво1е.нг1оеьгпе("х2.а: " + х2.а); // ссылкам на объекты класса Х известно только о членах класса Х х2.а = 19ы // верно // х2.Ь = 27; // неверно, поскольку член Ь отсутствует у класса Х ) В данном примере класс у является производным от класса х.

Поэтому следующая операция присваивания: х2 = у; // тоже верно, поскольку класс т является производным от класса Х считается вполне допустимой. Ведь по ссылке на объект базового класса (в данном случае — это переменная х2 ссылки на объект класса Х) можно обращаться к объекту производного класса, т.е. к объекту, на который ссылается переменная у. Следует особо подчеркнуть, что доступ к конкретным членам класса определяется типом переменной ссылки на объект, а не типом объекта, на который она ссылается. Это означает, что если ссылка на объект производного класса присваивается переменной ссылки на объект базового класса, то доступ разрешается только к тем частям этого объекта, которые определяются базовым классом.

Именно поэтому переменной х2 недоступен член Ь класса У, когда она ссылается на объект этого класса. И в этом есть своя логика, поскольку базовому классу ничего не известно о тех членах, которые до- Глава 11. Насведоввние 353 бавлены в производный от него класс. Именно поэтому последняя строка кода в приведенном выше примере была закомментирована. Несмотря на кажущийся несколько отвлеченным характер приведенных выше рассуждений, им можно найти ряд важных применений на практике.

Одно из них рассматривается ниже, а другое — далее в этой главе, когда речь пойдет о виртуальных методах. Один из самых важных моментов для присваивания ссылок на объекты производного класса переменным базового класса наступает тогда, когда конструкторы вызываются в иерархии классов. Как вам должно быть уже известно, в классе нередко определяется конструктор, принимающий объект своего класса в качестве параметра.

Благодаря этому в классе может быть сконструирована копия его объекта. Этой особенностью можно выгодно воспользоваться в классах, производных от такого класса. В качестве примера рассмотрим очередные варианты классов ТыоОЯЬаре и Тг1апо1е. В оба класса добавлены конструкторы, принимающие объект в качестве параметра. // Передать ссылку на объект производного класса ?? переменной ссылки на объект базового класса. ов1пс Бувсеьн с1авв ТиоОБЬаре ( бопЬ1е ргь нгбГЬ? СопЬ1е рг1 ЬеьЧЬГ; /! Конструктор по умолчанию. роЬ11с ТноОБЬаре() ( Нгбсп = Неьдпс = О.О; ) Конструктор длн класса ТноОЯЬаре.

роЬ11с ТноОБЬаре(бооЬ1е н, допЬ1е Ь) ( Хтбсп = н~ нетэпг = Ь; Сконструировать объект равной ширины и высоты. рпЬ11с Тноозпаре(бооЬ1е х) ( Нтбсп = Не1ЧЬГ = х; ) Сконструировать копию объекта ТноОБЬаре. роЬ11с ТноОЯЬаре(ТноОБЬаре оЬ) ( Н1бгп = ОЬ.Х1бГЬ; НеьЧЬГ = оЬ.НеьдЬГ; ) !/ Свойства ширины и высоты объекта. роЬ11с бопЬ1е Н1бГЬ ( Бес ( гесогп рг1 ньбгЬ; зес ( рг1 н1бГЬ = ча1ое < 0 ? -ча1пе : ча1пе; ) ) роЬ11с СооЬ1е НеьЧЬГ ( 354 Часть!. Язык С() Нет ( тетигп ргт Ье10Ьт; ] яет ( ртз ье1яьт = ча1ие < 0 7 -ча1ие : ча1ие! риЬ1тс чотб ЯЬон01щ() ( Сопяо1е.иг1теаьпе("Ширина и высота равны " Х1бтЬ + " и " + Нездьт)) ) ) // Класс для треугольников, производный от класса Тносзиаре.

с1аяя Тг1апи1е : ТноВЯЬаре ( ятг1пс Яту1е; // Конструктор, используемый по умолчанию. риЫтс Тг1апо1е() ( Яту1е = " 11"; ) Конструктор для класса Ттзапд1е. риЬ1тс Тт1апц1е(яттзпц я, боиЬ1е н, боиЬ1е Ь) : Ьаяе(н, Ь) ( Ягу1е = я; ) Сконструировать равнобедренный треугольник. риЫТс Тг1апо1е(боиЫе х): Ьаяе(х) ( Яту1е = "равнобедренный"," ) Сконструировать копию объекта типа Тг1ап01е.

риЬ11с Тттапд1е(Тт1апд1е оЬ) : Ьаяе(оЫ ( Ягу1е = оЬ.Ягу1е; Возвратить площадь треугольника. риЬ1тс боиЫе аггея() гетигп Хтдти * не!сит / 2) ) // Показать тип треугольника. риЬ1тс чо1д ЯЬонЯту1е() ( Сопяо1е.ит1те11пе("Треугольник " + Яту1е); ) с1аяя ЯЬарея7 ( агат!с чо16 Ма1п() ( Тг1апд1е т1 = лен Тг1апо1е("прямоугольный", 8.0, 12.0) Сделать копию объекта т1. Ттзапц1е т2 = пен Тгзап01е(та) Сопяо1е.кт1те11пе("Сведения об объекте т!." "); т1.яЬоняту1е()) Глава 11.

Насведоваиие 355 С1.ЯЬОИО1ш () ) солво1е.иг1сешпе("площадь равна " + с1.йгеа()); Соляо1е.нг1геьеле() Солао1е.ИгьгеЬьле("Сведения аб объекте С2: "); С2.ЯЬонзгу1е()) С2.5ЬонО1ш()1 Солзо1е.Игьсеъьле("Площадь равна " + Г2.йгеа())) ) В представленном выше примере объект С2 конструируется из объекта С1 и поэтому подобен ему. Ниже приведен результат'выполнения кода из данного примера. Сведения об объекте С1: Треугольник прямоугольный Ширина и высота равны 8 и 12 Плошадь равна 48 Сведения об объекте С2: Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48 Обратите особое внимание на следующий конструктор класса Тгьалд1е: рнш1с Тгьалд1е(Тгьал81е оЬ) : Ьаве(оЫ ( Ягу1е = оЬ.ЯСу1е; ) Он принимает объект типа тгьалд1е в качестве своего параметра и передает его (с помощью ключевого слова ьаяе) следующему конструктору класса тиоРБьаре.

риЬ11с ТноОЯЬаре(ТноОЯЬаре оЫ ( И1ПСЬ = оЬ.И1ПСЫ Пеьдьг = оЬ.ПеьЧЬЫ ) Самое любопытное, что конструктор ТиоРБЬаре () предполагает получить объект класса ТиоРБЬаре, тогда как конструктор ТгТалд1е () передает ему объект класса ТгТало1е. Как пояснялось выше, такое вполне допустимо, поскольку по ссылке на объект базового класса можно обращаться к объекту производного класса. Следовательно, конструктору ТиоРЯЬаре () можно на совершенно законных основаниях передать ссылку на объект класса, производного от класса ТиоРБЬаре.

А поскольку конструктор ТИОРБЬаре () инициализирует только те части объекта производного класса, которые являются членами класса ТиоРБЬаре, то для него не имеет никакого значения, содержит ли этот объект другие члены, добавленные в производном классе. Виртуальные методы и их переопределение Ви)ллуальным называется такой метод, который объявляется как узгсиа1 в базовом классе. Виртуальный метод отличается тем, что он может быть переопределен в одном или нескольких производных классах. Следовательно, у каждого производного класса 356 Часть!. Язык С() может быть свой вариант виртуального метода. Кроме того, виртуальные методы интересны тем, что именно происходит при их вызове по ссылке на базовый класс.

В этом случае средствами языка СЗ определяется именно тот вариант виртуального метода, который следует вызывать, исходя из типа объекта, к которому происходит обращение по ссылке, причем это делается во время выполнения. Поэтому при ссылке на разные типы объектов выполняются разные варианты виртуального метода. Иными словами, вариант выполняемого виртуального метода выбирается по типу объекта, а не по типу ссылки на этот объект. Так, если базовый класс содержит виртуальный метод и от него получены производные классы, то при обращении к разным типам объектов по ссылке на базовый класс выполняются разные варианты этого виртуального метода.

Метод объявляется как виртуальный в базовом классе с помощью ключевого слова ч1 гспа1, указываемого перед его именем. Когда же виртуальный метод переопределяется в производном классе, то для этого используется модификатор очегг1с)е. А сам процесс повторного определения виртуального метода в производном классе называется переопределением метода.

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

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

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

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