Чтение онлайн

ЖАНРЫ

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

однако, иметь в виду, что это совершенно отдельное применение ключевого слова new, не похожее на его применение при создании экземпляра объекта.

Ниже приведен пример сокрытия имени.

// Пример сокрытия имени с наследственной связью.

using System;

class А {

public int i = 0;

}

// Создать производный класс. j

class В : A { *

new int i; // этот член скрывает член i

из класса А public В(int b) {

i = Ь; // член 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 для доступа к скрытому имени

Имеется еще одна форма ключевого слова 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 из класса В

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