Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Применение ключевого слова base для доступа к скрытому имени C# Полное руководство Герберт Шилдт

Применение ключевого слова base для доступа к скрытому имени C# Полное руководство Герберт Шилдт

Имеется еще одна форма ключевого слова 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 = 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() в классе А
   public void Show() {
      Console.WriteLine("Член i в базовом классе: " + i);
   }
}

// Создать производный класс/
class В : А {
   new int i; // этот член скрывает член i из класса А
   
   public В(int a, int b) {
      base.i = а; // здесь обнаруживается скрытый член из класса А
      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 (), определенный в базовом классе А.