Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Руководство_по_C#.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
10 Мб
Скачать
☆

7.4Наследование и сокрытие имен

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

using System;

namespace ConsoleApplication1

{

class MyClass

{ public int x = 10, y = 5, z = 6; }

class ClassA : MyClass

{

// Скрываем члены класса MyClass

public new int x = 12, y = -2, z = -5;

}

class ClassB : MyClass

{ public int x; }

class Program

{

static void Main()

{

ClassA obj1 = new ClassA();

ClassB obj2 = new ClassB();

Console.WriteLine("Координаты объекта obj1: {0} {1} {2}",

obj1.x, obj1.y, obj1.z);

Console.WriteLine("Координаты объекта obj2: {0} {1} {2}",

obj2.x, obj2.y, obj2.z);

Console.ReadKey();

}

}

}

Вывод программы:

Координаты объекта obj1: 12 -2 -5

Координаты объекта obj2: 0 5 6

Несмотря на то, что данный пример работает корректно, IDE-среда Visual Studio 2010 выводит предупреждения в отношении члена класса ClassB x.

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

Имеется еще одна форма ключевого слова base, которая действует подобно ключевому слову this, за исключением того, что она всегда ссылается на базовый класс в том производном классе, в котором она используется. Ниже эта форма приведена в общем виде:

base.член

где член может обозначать метод или переменную экземпляра. Эта форма ключевого слова base чаще всего применяется в тех случаях, когда под именами членов производного класса скрываются члены базового класса с теми же самыми именами. С помощью ключевого слова base могут также вызываться скрытые методы. Давайте рассмотрим пример:

using System;

namespace ConsoleApplication1

{

class MyClass

{

public int x;

}

class ClassA : MyClass

{

new int x = 10;

public void someMethod(int i1, int i2)

{

// Координата x из базового класса MyClass

base.x = i1;

Console.WriteLine("x (в базовом классе) = " + base.x);

// Координата x из класса ClassA

x = i2;

Console.WriteLine("x (в производном классе) = " + x);

}

}

class Program

{

static void Main()

{

ClassA obj1 = new ClassA();

obj1.someMethod(1, 25);

Console.ReadLine();

}

}

}

Вывод программы:

x (в базовом классе) = 1

x (в производном классе) = 25