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

Наследование и сокрытие имен C# Полное руководство Герберт Шилдт

В производном классе можно определить член с таким же именем, как и у члена его базового класса. В этом случае член базового класса скрывается в производном классе. И хотя формально в C# это не считается ошибкой, компилятор все же выдаст сообщение, предупреждающее о том, что имя скрывается. Если член базового класса требуется скрыть намеренно, то перед его именем следует указать ключевое слово new, чтобы избежать появления подобного предупреждающего сообщения. Следует, однако, иметь в виду, что это совершенно отдельное применение ключевого слова new, не похожее на его применение при создании экземпляра объекта.
Ниже приведен пример сокрытия имени.

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

using System;

class А {
   public int i = 0;
}

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