Применение ключевого слова 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 = a; // здесь обнаруживается скрытый член из класса А

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 = 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;

}

 

// Свойства ширины и высоты объекта,  

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 {


Дата добавления: 2019-02-12; просмотров: 302; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!