Страница 155 из 502
<b>}</b>
Вот к какому результату приводит выполнение этого кода.
<b>Сведения об объекте t1:</b>
<b>Треугольник прямоугольный </b>
<b>Ширина и высота равны 8 и 12 </b>
<b>Площадь равна 48</b>
<b>Сведения об объекте t2:</b>
<b>Треугольник прямоугольный </b>
<b>Ширина и высота равны 8 и 12 </b>
<b>Площадь равна 48</b>
<b>Сведения об объекте t3:</b>
<b>Треугольник равнобедренный </b>
<b>Ширина и высота равны 4 и 4 </b>
<b>Площадь равна 8</b>
А теперь рассмотрим вкратце основные принципы действия ключевого слова base. Когда в производном классе указывается ключевое слово base, вызывается конструктор из его непосредственного базового класса. Следовательно, ключевое слово base всегда обращается к базовому классу, стоящему в иерархии непосредственно над вызывающим классом. Это справедливо даже для многоуровневой иерархии классов. Аргументы передаются базовому конструктору в качестве аргументов метода base(). Если же ключевое слово отсутствует, то автоматически вызывается конструктор, используемый в базовом классе по умолчанию.
Наследование и сокрытие имен
В производном классе можно определить член с таким же именем, как и у члена его базового класса. В этом случае член базового класса скрывается в производном классе. И хотя формально в C# это не считается ошибкой, компилятор все же выдаст сообщение, предупреждающее о том, что имя скрывается. Если член базового класса требуется скрыть намеренно, то перед его именем следует указать ключевое слово new, чтобы избежать появления подобного предупреждающего сообщения. Следует,
однако, иметь в виду, что это совершенно отдельное применение ключевого слова new, не похожее на его применение при создании экземпляра объекта.
Ниже приведен пример сокрытия имени.
// Пример сокрытия имени с наследственной связью.
using System;
class А {
public int i = 0;
}
// Создать производный класс. j
class В : A { *
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, которая действует подобно ключевому слову this, за исключением того, что она всегда ссылается на базовый класс в том производном классе, в котором она используется. Ниже эта форма приведена в общем виде:
<b>base<i>.член</i></b>
где член может обозначать метод или переменную экземпляра. Эта форма ключевого слова base чаще всего применяется в тех случаях, когда под именами членов производного класса скрываются члены базового класса с теми же самыми именами. В качестве примера ниже приведен другой вариант иерархии классов из предыдущего примера.
<b>// Применение ключевого слова base для преодоления </b>
<b>// препятствия, связанного с сокрытием имен.</b>
<b>using System;</b>
<b>class А {</b>
<b> public int i = 0;</b>
<b>}</b>
<b>// Ссзздать производный класс, </b>
<b>class В : А {</b>
<b> new int i; // этот член скрывает член i из класса А</b>
<b> public В(int a, int b) {</b>
<b> base.i = a; // здесь обнаруживается скрытый член из класса А</b>
<b> i = b; // член i из класса В</b>
<b> }</b>
<b> public void Show() {</b>
<b> // Здесь выводится член i из класса А.</b>
<b> Console.WriteLine("Член i в базовом классе: " + base.i);</b>
<b> // А здесь выводится член i из класса В.</b>
<b> Console.WriteLine("Член i в производном классе: " + i);</b>
<b> }</b>
<b>}</b>
<b>class UncoverName { </b>
<b> static void Main() {</b>
<b> В ob = new В(1, 2); </b>
<b> ob.Show();</b>
<b> }</b>
<b>}</b>