Главная » Просмотр файлов » 1629295407-c61bfe4caba98380ea3e7cdae6295416

1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 52

Файл №846200 1629295407-c61bfe4caba98380ea3e7cdae6295416 (Шилдт Герберт - Полный справочник по C#) 52 страница1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200) страница 522021-08-18СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Вероятно, вам приходилосьслышать эти термины, но мы будем придерживаться стандартных C#-терминов. В C++также используются термины “базовый класс/производный класс”.Использование защищенного доступаКак упоминалось выше, закрытый член базового класса недоступен для производногокласса. Казалось бы, это означает, что, если производный класс должен иметь доступ кчлену базового класса, его нужно сделать открытым. При этом придется смириться с тем,что открытый член будет доступным для любого другого кода, что иногда нежелательно. Ксчастью, таких ситуации можно избежать, поскольку C# позволяет создавать защищенныечлены. Защищенным является член, который открыт для своей иерархии классов, но закрытвне этой иерархии.Защищенный член создается с помощью модификатора доступа protected.

Приобъявлении protected-члена он по сути является закрытым, но с одним исключением.Это исключение вступает в силу, когда защищенный член наследуется. В этом случаезащищенный член базового класса становится защищенным членом производного класса, аследовательно, и доступным для производного класса. Таким образом, используямодификатор доступа protected, можно создавать закрытые (для “внешнегоГлава 11. Наследование283мира”) члены класса, но вместе с тем они будут наследоваться с возможностью доступа состороны производных классов.Рассмотрим простой пример использования защищенных членов класса.// Демонстрация использования защищенных членов класса.using System;class В {protected int i, j;// Закрыт внутри класса В,//но доступен для класса D.public void set(int a, int b) {i = a;j = b;}}public void show() {Console.WriteLine(i + " " + j);}class D : В {int k; // Закрытый член.// Класс D получает доступ к членам i и j класса В.public void setk() {k = i * j;}}public void showk() {Console.WriteLine(k);}class ProtectedDemo {public static void Main() {D ob = new D();}}ob.set(2, 3); // OK, так как D "видит" В-члены i и j.ob.show(); // OK, так как D "видит" В-члены i и j.ob.setk(); // OK, так как это часть самого класса D.ob.showk(); // OK, так как это часть самого класса D.Поскольку в этом примере класс в наследуется классом D и члены i и j объявленызащищенными в классе в (т.е.

с использованием модификатора доступа protected), методsetk() может получить к ним доступ. Если бы члены i и j были объявлены в классе взакрытыми, класс D не имел бы к ним права доступа, и программа не скомпилировалась бы.Подобно модификаторам public и private модификатор protected остается сосвоим членом независимо от реализуемого количества уровней наследования.Следовательно, при использовании производного класса в качестве базового для созданиядругого производного класса любой защищенный член исходного базового класса, которыйнаследуется первым производным классом, также наследуется в статусе защищенного ивторым производным классом.284Часть I.

Язык C#Конструкторы и наследованиеВ иерархии классов как базовые, так и производные классы могут иметь собственныеконструкторы. При этом возникает важный вопрос: какой конструктор отвечает за созданиеобъекта производного класса? Конструктор базового или конструктор производного класса,или оба одновременно? Ответ таков: конструктор базового класса создает часть объекта,соответствующую базовому классу, а конструктор производного класса — часть объекта,соответствующую производному классу. И это вполне логично, потому что базовый класс“не видит” или не имеет доступа к элементам производного класса.

Поэтому ихконструкции должны быть раздельными. В предыдущих примерах классы опирались наконструкторы по умолчанию, создаваемые автоматически средствами C#, и поэтому мы несталкивались с подобной проблемой. Но на практике большинство классов имеетконструкторы, и вы должны знать, как справляться с подобной ситуацией.Если конструктор определяется только в производном классе, процесс созданияобъекта несложен: просто создается объект производного класса. Часть объекта,соответствующая базовому классу, создается автоматически с помощью конструктора поумолчанию. Например, рассмотрим переработанную версию класса Triangle, в которойопределяется конструктор. Здесь член style объявлен private-членом, поскольку теперьон устанавливается конструктором.// Добавление конструктора в класс Triangle.using System;// Класс двумерных объектов.class TwoDShape {double pri_width; // Закрытый член.double pri_height; // Закрытый член.}// Свойства width и height.public double width {get { return pri_width; }set { pri_width = value; }}public double height {get { return pri_height; }set { pri_height = value; }}public void showDim() {Console.WriteLine("Ширина и высота равны " +width + " и " + height);}// Класс треугольников - производный от класса TwoDShape.class Triangle : TwoDShape {string style; // Закрытый член.// Конструктор.public Triangle(string s, double w, double h) {width = w; // Инициализирует член базового класса.height = h; // Инициализирует член базового класса.Глава 11.

Наследование285}style = s; // Инициализирует член своего класса.}// Метод возвращает значение площади треугольника.public double area() {return width * height / 2;}// Отображаем тип треугольника.public void showStyle() {Console.WriteLine("Треугольник " + style);}class Shapes3 {public static void Main() {Triangle t1 = new Triangle("равнобедренный",4.0, 4.0);Triangle t2 = new Triangle("прямоугольный",8.0, 12.0);Console. WriteLine("Информация о t1: ");t1.showStyle();t1.showDim();Console.WriteLine("Площадь равна " + t1.area());Console.WriteLine();}}Console.WriteLine("Информация о t2: ");t2.showStyle();t2.showDim();Console.WriteLine("Площадь равна " + t2.area());Здесь конструктор класса Triangle инициализирует наследуемые им члены классаTwoDShape, а также собственное поле style.Если конструкторы определены и в базовом, и в производном классе, процесссоздания объектов несколько усложняется, поскольку должны выполниться конструкторыобоих классов.

В этом случае необходимо использовать еще одно ключевое слово C# base,которое имеет два назначения: вызвать конструктор базового класса и получить доступ кчлену базового класса, который скрыт “за” членом производного класса. Сначаларассмотрим первое назначение слова base.Вызов конструкторов базового классаПроизводный класс может вызывать конструктор, определенный в его базовомклассе, используя расширенную форму объявления конструктора производного класса иключевое слово base.

Формат расширенного объявления таков:конструктор_производного_класса(список_параметров) : base(список_аргументов) {// тело конструктора}Здесь с помощью элемента список_аргументов задаются аргументы,необходимые конструктору в базовом классе.286Часть I. Язык C#Чтобы понять, как используется ключевое слово base, рассмотрим в следующейпрограмме еще одну версию класса TwoDShape.

В ней определяется конструктор, которыйинициализирует свойства width и height.// Добавление конструкторов в класс TwoDShape.using System;// Класс двумерных объектов.class TwoDShape {double pri_width; // Закрытый член.double pri_height; // Закрытый член.// Конструктор класса TwoDShape.public TwoDShape(double w, double h) {width = w;height = h;}// Свойства width и height.public double width {get { return pri_width; }set { pri_width = value; }}public double height {get { return pri_height; }set { pri_height = value; }}}public void showDim() {Console.WriteLine("Ширина и высота равны " +width + " и " + height);}// Класс треугольников, производный от класса TwoDShape.class Triangle : TwoDShape {string style; // Закрытый член.// Вызываем конструктор базового класса.public Triangle(string s,double w,double h) : base(w, h) {style = s;}// Метод возвращает площадь треугольника.public double area() {return width * height / 2;}}// Отображаем тип треугольника.public void showStyle() {Console.WriteLine("Треугольник " + style);}Глава 11.

Наследование287class Shapes4 {public static void Main() {Triangle t1 = new Triangle("равнобедренный", 4.0, 4.0);Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0);Console.WriteLine("Информация о t1: ");t1.showStyle();t1.showDim();Console. WriteLine("Площадь равна " + t1.area());Console.WriteLine();}}Console.WriteLine("Информация о t2: ");t2.showStyle();t2.showDim();Console.WriteLine("Площадь равна " + t2.area());Здесь конструктор Triangle() вызывает “метод” base() с параметрами w и h, чтов действительности означает вызов конструктора TwoDShape(), который инициализируетсвойства width и height значениями w и h, соответственно. Класс Triangle больше неинициализирует эти значения сам. Ему остается инициализировать только одно значение,уникальное для класса треугольников, а именно член style (тип треугольника).

Такойподход дает классу TwoDShape свободу выбора среди возможных способов построенияподобъектов. Более того, со временем класс TwoDShape может расширять свои функции,но об этом расширении ранее созданные производные классы не будут “знать”, чтопредотвратит существующий код от разрушения.С помощью ключевого слова base можно вызвать конструктор любой формы,определенный в базовом классе. Реально же выполнится тот конструктор, параметрыкоторого будут соответствовать переданным при вызове аргументам.

Например, вот каквыглядят расширенные версии классов TwoDShape и Triangle, которые включаютконструкторы по умолчанию и конструкторы, принимающие один аргумент:// Добавляем в класс TwoDShape конструкторы.using System;class TwoDShape {double pri_width; // Закрытый член.double pri_height; // Закрытый член.// Конструктор по умолчанию.public TwoDShape() {width = height = 0.0;}// Конструктор класса TwoDShape с параметрами.public TwoDShape(double w, double h) {width = w;height = h;}// Создаем объект, у которого ширина равна высоте.public TwoDShape(double x) {width = height = x;}288Часть I.

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

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

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

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