Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Полное руководство. С# 4.0 - Шилдт Герберт

Полное руководство. С# 4.0 - Шилдт Герберт

Читать онлайн Полное руководство. С# 4.0 - Шилдт Герберт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 68 69 70 71 72 73 74 75 76 ... 188
Перейти на страницу:

Теперь конструктор класса Triangle объявляется следующим образом.public Triangle( string s, double w, double h) : base(w, h) {

В данном варианте конструктор 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 х) { Width = Height = x; } // Свойства ширины и высоты объекта. public double Width { get { return pri_width; } set { pri_width = value < 0 ? -value : value; } } public double Height { get { return pri_height; } set { pri_height = value < 0 ? -value : value; } } public void ShowDim() { Console.WriteLine("Ширина и высота равны " + Width + " и " + Height); }}// Класс для треугольников, производный от класса TwoDShape.class Triangle : TwoDShape { string Style; /* Конструктор, используемый по умолчанию. Автоматически вызывает конструктор, доступный по умолчанию в классе TwoDShape. */ public Triangle() { Style = "null"; } // Конструктор, принимающий три аргумента. public Triangle( string s, double w, double h) : base (w, h) { Style = s; } // Сконструировать равнобедренный треугольник. public Triangle(double x) : base(x) { Style = "равнобедренный"; } // Возвратить площадь треугольника. public double Area() { return Width * Height / 2; } // Показать тип треугольника. public void ShowStyle() { Console.WriteLine("Треугольник " + Style); }}class Shapes5 { static void Main() { Triangle t1 = new Triangle(); Triangle t2 = new Triangle("прямоугольный", 8.0, 12.0); Triangle t3 = new Triangle(4.0); t1 = t2; Console.WriteLine("Сведения об объекте t1: "); t1.ShowStyle(); t1.ShowDim(); Console.WriteLine("Площадь равна " + t1.Area()); Console.WriteLine(); Console.WriteLine("Сведения об объекте t2: "); t2.ShowStyle(); t2.ShowDim(); Console.WriteLine("Площадь равна " + t2.Area()); Console.WriteLine(); Console.WriteLine("Сведения об объекте t3: "); t3.ShowStyle(); t3.ShowDim(); Console.WriteLine("Площадь равна " + t3.Area()); Console.WriteLine(); }}

Вот к какому результату приводит выполнение этого кода.Сведения об объекте t1:Треугольник прямоугольныйШирина и высота равны 8 и 12Площадь равна 48Сведения об объекте t2:Треугольник прямоугольныйШирина и высота равны 8 и 12Площадь равна 48Сведения об объекте t3:Треугольник равнобедренныйШирина и высота равны 4 и 4Площадь равна 8

А теперь рассмотрим вкратце основные принципы действия ключевого слова base.Когда в производном классе указывается ключевое слово base, вызывается конструкториз его непосредственного базового класса. Следовательно, ключевое слово base всегдаобращается к базовому классу, стоящему в иерархии непосредственно над вызывающим классом. Это справедливо даже для многоуровневой иерархии классов. Аргументы передаются базовому конструктору в качестве аргументов метода base(). Если жеключевое слово отсутствует, то автоматически вызывается конструктор, используемыйв базовом классе по умолчанию.Наследование и сокрытие имен

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

Ниже приведен пример сокрытия имени.// Пример сокрытия имени с наследственной связью.using System;class А { public int i = 0;}// Создать производный класс.class В : А { new int i; // этот член скрывает член i из класса А public В (int b) { i = b; // член i в классе В } public void Show() { Console.WriteLine("Член i в производном классе: " + i); }}class NameHiding { static void Main() { В ob = new В(2); ob.Show(); }}

Прежде всего обратите внимание на использование ключевого слова new в следующей строке кода.new int i; // этот член скрывает член i из класса А

В этой строке компилятору, по существу, сообщается о том, что вновь создаваемая переменная i намеренно скрывает переменную i из базового класса А и что автору программы об этом известно. Если же опустить ключевое слово new в этой строкекода, то компилятор выдаст предупреждающее сообщение.

Вот к какому результату приводит выполнение приведенного выше кода.Член i в производном классе: 2

В классе В определяется собственная переменная экземпляра i, которая скрываетпеременную i из базового класса А. Поэтому при вызове метода Show() для объекта типа В выводится значение переменной i, определенной в классе В, а не той, чтоопределена в классе А.Применение ключевого слова base для доступа к скрытому имени

Имеется еще одна форма ключевого слова base, которая действует подобно ключевому слову this, за исключением того, что она всегда ссылается на базовый классв том производном классе, в котором она используется. Ниже эта форма приведенав общем виде:base.член

где член может обозначать метод или переменную экземпляра. Эта форма ключевогослова base чаще всего применяется в тех случаях, когда под именами членов производного класса скрываются члены базового класса с теми же самыми именами. В качествепримера ниже приведен другой вариант иерархии классов из предыдущего примера.// Применение ключевого слова base для преодоления// препятствия, связанного с сокрытием имен.using System;class А { public int i = 0;}// Создать производный класс.class В : А { new int i; // этот член скрывает член i из класса А public В(int a, int b) { base.i = а; // здесь обнаруживается скрытый член из класса А i = b; // член i из класса В } public void Show() { // Здесь выводится член i из класса А. Console.WriteLine("Член i в базовом классе: " + base.i); // А здесь выводится член i из класса В. Console.WriteLine("Член i в производном классе: " + i); }}class UncoverName { static void Main() { В ob = new В(1, 2); ob.Show(); }}

Выполнение этого кода приводит к следующему результату.Член i в базовом классе: 1Член i в производном классе: 2

Несмотря на то что переменная экземпляра i в производном классе В скрываетпеременную i из базового класса А, ключевое слово base разрешает доступ к переменной i, определенной в базовом классе.

С помощью ключевого слова base могут также вызываться скрытые методы.Например, в приведенном ниже коде класс В наследует класс А и в обоих классахобъявляется метод Show(). А затем в методе Show() класса В с помощью ключевогослова base вызывается вариант метода Show(), определенный в классе А.// Вызвать скрытый метод.using System;class А { public int i = 0; // Метод Show() в классе A public void Show() { Console.WriteLine("Член i в базовом классе: " + i); }}// Создать производный класс.class В : А { new int i; // этот член скрывает член i из класса А public В(int a, int b) { base.i = а; // здесь обнаруживается скрытый член из класса А i = b; // член i из класса В } // Здесь скрывается метод Show() из класса А. Обратите // внимание на применение ключевого слова new. new public void Show() { base.Show(); // здесь вызывается метод Show() из класса А // далее выводится член i из класса В Console.WriteLine("Член i в производном классе: " + i); }}class UncoverName { static void Main() { В ob = new В(1, 2); ob.Show(); }}

1 ... 68 69 70 71 72 73 74 75 76 ... 188
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Полное руководство. С# 4.0 - Шилдт Герберт.
Комментарии