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