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

Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 65

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

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

Более того, этот порядок остается неизменным независимо от использования ключевого слова Ьаяе. Так, если ключевое слово Ьаяе ие используется, то выполняется конструктор по умолчанию, т.е. конструктор без параметров. В приведенном ниже примере программы демонстрируется порядок вызова и выполнения конструкторов. // Продеыонстрировать порядок вызова конструкторов. няапд Зуякези // Создать базовый класс. с1аяя А ( рпЬ11с А() ( Сопяо1е.Иг1кепвпе("Конструирование класса А."); ) ) // Создать класс, производный от класса А.

с1аяя В т А ( роЬ11с В() ( Сопяо1е.ик Ееъвпе("Конструирование класса В.")т ) ) // Созлать класс, производный от класса В. с1аяя С ". В ( ривттс С О ( Сопяо1е.иг1се11пе("Конструирование класса С."); ) ) с1аяя Огбеготсопякгпск1оп ( якаквс то1б Мавп() ( Сс=пенС()т Глава 11. Наследование 337 Вот к какому результату приводит выполнение атой программы: Конструирование класса А. Конструирование класса В.

конструирование класса С. Как видите, конструкторы вызываются по порядку выведения их классов. Если хорошенько подумать, то в вызове конструкторов по порядку выведения их классов можно обнаружить определенный смысл. Ведь базовому классу ничего не известно ни об одном из производных от него классов, и поэтому любая инициализация, которая требуется его членам, осуществляется совершенно отдельно от инициализации членов производного класса, а возможно, это и необходимое условие.

Следовательно, она должна выполняться первой. Ссылки на базовый класс и обьекты производных классов Как вам должно быть уже известно, СФ является строго типизированным языком программирования. Помимо стандартных преобразований и автоматического продвижения простых типов значений, в атом языке строго соблюдается принцип совместимости типов. Это означает, что переменная ссылки на объект класса одного типа, как правило, не может ссылаться на объект класса другого типа. В качестве примера рассмотрим следующую программу, в которой объявляются два класса одинаковой структуры: О Зта программа не подлежит компиляции.

с1аяв Х ( 1пс а; рцвтъс Х(тпп 1) ( а = 1; ) с1авв т ( ъпс а1 рцв11с Х(1пп 1) ( а = 1; ) с1авя 1псошра11Ь1епег ( впап1с яо10 Иа1п() ( Х х = пен Х(10): Х х2; у у = лен у(5); х2 = х; // верно, поскольку оба объекта О относятся к одному и тому же типу х2 = у) // Ошибка, поскольку это разнотипные объекты ) 338 Часть ).

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

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

Ниже приведен соответствующий пример. // По ссылке на объект базового класса можно обращаться // к объекту производного класса. озала зузсеач с1азз Х ( рпЫъс гпк ат рпЫъс Х(1пк 1) ( а = 1) ) ) с1аээ У к Х ( рпЫ1с 1пк Ь! рпЬ11с У(1пк 1, 1пк 2) : Ьазе (1) Ь = 1) ) ) с1ааа Вааеает ( экак1с тоъб Маго() ( Х х = пен Х(10); Х х2т у у = пен т(5, 6) т х2 = х; // верно, поскольку оба объекта // относятся к одному и тому же типу Сопзо1е.нгьсе11пе("х2.а: " т х2.а)т х2 = ут // тоже верно, поскольку класс у является // производным от класса Х Сопзо1е.иг1кеъьпе("х2.а: " + х2.а)т // ссылкам на объекты класса Х известно только о // членах класса Х х2.а = 192 // верно Глава )).

наследование 339 // х2.Ь = 277 // неверно, поскольку член Ь отсутствует у класса Х В данном примере класс у является производным от класса х. Поэтому следующая операция присваивания: х2 = уи // тоже верно, поскольку класс т является производным от класса Х считается вполне допустимой.

Ведь по ссылке на объект базового класса Гв данном случае — это переменная х2 ссылки на объект класса х) можно обращаться к объекту производного класса, т.е. к объекту, на который ссылается переменная у. Следует особо подчеркнуть, что доступ к конкретным членам класса определяется типом переменной ссылки на объект, а не типом объекта, на который она ссылается. Это означает, что если ссылка на объект производного класса присваивается переменной ссылки на объект базового класса, то доступ разрешается только к тем частям этого объекта, которые определяются базовым классом. Именно поэтому переменной х2 недоступен член Ь класса У, когда она ссылается на объект этого класса. И в этом есть своя логика, пбскольку базовому классу ничего не известно о тех членах, которые добавлены в производный от него класс. Именно поэтому последняя строка кода в приведенном выше примере была закомментирована.

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

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

риЫгс Тнобзпаре(боиЬ1е х) ( Игбсп = НегдЬГ = х; // Сконструировать копию объекта ТноО5паре. риЫгс ТноОЯЛаре(ТноОЯЬаре оЬ) ( Игогп = оь.ньбспт Негдпс = оЬ.Неьдпст ) // Свойства ширины и высоты объекта. риЬ1гс боиЫе Иьбсп ( дес ( гесигп рта набГЛ; ) зес ( рг1 нкбГЛ = ча1ие < О ? -ча1ие к ча1ие; ) риЫ1с боиЫе Неадпс ( дес ( гекигп ргг Легдпст ) зег ( рг1 легдлг = ча1ие < О ? -ча1ие: ча1иет ) ) риЫгс чо1б ЯЛонбгш() ( Сопяо1е.Иг1сетапе("Ширина и высота равны " Ь и1бгл + " и " + не1длг)т ) ) // Класс для треугольников, производный от класса Тнобзпаре.

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

риЫгс Тг1апд1е(Тггапд1е оЫ : Ьаяе(оЬ) ( Ягу1е = оЬ.Ягу1ет Глава ((. Наследование 341 // Возвратить площадь треугольника. риЫгс бопЬ1е Агеа() гегогп ИТШГЬ * Не1опг / 27 ) // Показать тип треугольника. рпЫ1с тога ЯЬон5гу1е() ( Сопяо1е.нг1сеь1пе("Треугольник " + 5гу1е)7 ) ) с1азз Япарезт ( зсас1с тогб Магп() ( Тг1ап81е Г1 = пен Тг1апц1е("прямоугольный", 8.0, 12.0)7 // Сделать копии объекта Г1. Тгаапц1е Г2 = пен Тгаапд1е(С1) Сопзо1е.нг1генапе("Сведения об объекте С1: ")) С1.5пон5су1е()) С1.ЯЬонпгщ()7 Сопзо1е.нг1сеь1пе("Площадь равна " 4 С1.Агеа()); Сопво1е.Иг1геьапе Н ) Сопао1е.нг1геЫпе("Сведения об объекте Г2: ")7 С2.

5понзсу1е (); С2.ЯЬон01щ(); Сопзо1е.нгтсеьапе("Площадь равна " + С2.Агеа()); ) ) В представленном выше примере объект С2 конструируется из объекта С1 и поэтому подобен ему. Ниже приведен результат выполнения кода из данного примера. Сведения об объекте С1: Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48 Сведения об объекте С2: Треугольник прямоугольный Ширина и высота равны 8 и 12 Площадь равна 48 Обратите особое внимание на следуюший конструктор класса Тг1апо1е: рпЬ1гс Тггапц1е(Тгаапц1е оЫ: Ьаяе(оЬ) ( 5су1е = оЬ.ЯГу1ев ) Он принимает объект типа Тг1ащ1е в качестве своего параметра и передает его (с помощью ключевого слова Ьазе) следующему конструктору класса ТноРЯЬаре: 342 Часть (. Язык С№ роЬ11с тчоозьаре(теоозьаре оЬ) ( ИТЬЬЛ = оЬ.И1ВСЬ| не№дьс = оЬ.Не1дьск Самое любопытное, что конструктор Тыопзпаре () предполагает получить объект класса тыорзпаре, тогда как конструктор Тгъапд1е () передает ему объект класса тг1апя1е.

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

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

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

Г. Шилдт - С# 3.0 Полное руководство
C_sharp_3TCR_code
Apndx.lst
Chap2.lst
Chap3.lst
Chap4.lst
Chap5.lst
Chap6.lst
Chap7.lst
Chap8.lst
Chap9.lst
Chap10.lst
Chap11.lst
Chap12.lst
Chap13.lst
Chap14.lst
Chap15.lst
Chap16.lst
Chap17.lst
Chap18.lst
Chap19.lst
Chap20.lst
Chap21.lst
Chap22.lst
Chap23.lst
Chap24.lst
Chap25.lst
Chap26.lst
Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6458
Авторов
на СтудИзбе
304
Средний доход
с одного платного файла
Обучение Подробнее