Применение ключевого слова 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 = Ь; // член 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;
11 Метод Show() в классе A public void Show() {
Console.WriteLine("Член i в базовом классе: " + i);
}
}
// Создать производный класс, class В : А {
new int i; // этот член скрывает член i из класса А
public В(int a, int b) {
base.i = а; // здесь обнаруживается скрытый член из класса А
i = Ь; // член 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 ();
}
}
Выполнение этого кода приводит к следующему результату.
Член i в базовом классе: 1 Член i в производном классе: 2
Как видите, в выражении base. Show () вызывается вариант метода Show () из базового класса.
Обратите также внимание на следующее: ключевое слово new используется в приведенном выше коде с целью сообщить компилятору о том, что метод Show (), вновь объявляемый в производном классе В, намеренно скрывает другой метод Show (), определенный в базовом классе А.
Создание многоуровневой иерархии классов
В представленных до сих пор примерах программ использовались простые иерархии классов, состоявшие только из базового и производного классов. Но в C# мож
но также строить иерархии, состоящие из любого числа уровней наследования. Как упоминалось выше, многоуровневая иерархия идеально подходит для использования одного производного класса в качестве базового для другого производного класса. Так, если имеются хри класса, А, В и С, то класс С может наследовать от класса В, а тот, в свою очередь, от класса А. В таком случае каждый производный класс наследует характерные особенности всех своих базовых классов. В частности, класс С наследует все члены классов В и А.