Страница 156 из 502
Выполнение этого кода приводит к следующему результату.
<b>Член i в базовом классе: 1 </b>
<b>Член i в производном классе: 2</b>
Несмотря на то что переменная экземпляра i в производном классе В скрывает переменную i из базового класса А, ключевое слово base разрешает доступ к переменной i, определенной в базовом классе.
С помощью ключевого слова base могут также вызываться скрытые методы. Например, в приведенном ниже коде класс В наследует класс А и в обоих классах объявляется метод Show(). А затем в методе Show() класса В с помощью ключевого слова base вызывается вариант метода Show(), определенный в классе А.
<b>// Вызвать скрытый метод.</b>
<b>using System;</b>
<b>class А {</b>
<b> public int i = 0;</b>
<b><i> //</i> Метод Show() в классе A </b>
<b> public void Show() {</b>
<b> Console.WriteLine("Член i в базовом классе: " + i);</b>
<b> }</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> // Здесь скрывается метод Show() из класса А. Обратите </b>
<b> // внимание на применение ключевого слова new. </b>
<b> new public void Show() {</b>
<b> base.Show(); // здесь вызывается метод Show() из класса А</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>
Выполнение этого кода приводит к следующему результату.
<b>Член i в базовом классе: 1 </b>
<b>Член i в производном классе: 2</b>
Как видите, в выражении base.Show() вызывается вариант метода Show() из базового класса.
Обратите также внимание на следующее: ключевое слово new используется в приведенном выше коде с целью сообщить компилятору о том, что метод Show(), вновь объявляемый в производном классе В, намеренно скрывает другой метод Show(), определенный в базовом классе А .
Создание многоуровневой иерархии классов
В представленных до сих пор примерах программ использовались простые иерархии классов, состоявшие только из базового и производного классов. Но в C# можно также строить иерархии, состоящие из любого числа уровней наследования. Как упоминалось выше, многоуровневая иерархия идеально подходит для использования одного производного класса в качестве базового для другого производного класса. Так, если имеются три класса, А, В и С, то класс С может наследовать от класса В, а тот, в свою очередь, от класса А. В таком случае каждый производный класс наследует характерные особенности всех своих базовых классов. В частности, класс С наследует все члены классов В и А.
Для того чтобы показать, насколько полезной может оказаться многоуровневая иерархия классов, рассмотрим следующий пример программы. В ней производный класс Triangle служит в качестве базового для создания другого производного класса — ColorTriangle. При этом класс ColorTriangle наследует все характерные особенности, а по существу, члены классов Triangle и TwoDShape, к которым добавляется поле color, содержащее цвет треугольника.
<b>// Пример построения многоуровневой иерархии классов.</b>
<b>using System;</b>
<b>class TwoDShape { </b>
<b> double pri_width; </b>
<b> double pri_height;</b>
<b> // Конструктор, используемый по умолчанию, </b>
<b> public TwoDShape() {</b>
<b> Width = Height = 0.0;</b>
<b> }</b>