Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Переопределение членов базового класса

При объявлении членов производного класса в C# разрешено использовать те же самые имена, которые использовались при объявлении членов базового класса. Это касается как методов, так и данных-членов объявляемых классов.

В этом случае соответствующие члены базового класса считаются переопределёнными.

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

При переопределении в производном классе наследуемого члена его объявление в производном классе должно предваряться модификатором new. Если этот модификатор в объявлении производного класса опустить - ничего страшного не произойдёт. Транслятор всего лишь выдаст предупреждение об ожидаемом спецификаторе new в точке объявления переопределяемого члена класса.

Дело в том, что переопределённые члены базового класса при “взгляде” на производный класс “извне” не видны. В производном классе они замещаются переопределёнными членами и непосредственный доступ к этим членам возможен только из функций-членов базового и производного классов. При этом для обращения к переопределённому члену из метода производного класса используется ключевое слово base.

По мнению создателей языка C# тот факт, что ранее (до момента его переопределения) видимый член (базового) класса стал недоступен и невидим извне (в результате его переопределения в производном классе), требует явного дополнительного подтверждения со стороны программиста.

using System;

namespace Inheritance_2

{

class X

{

public X(){}

public X(int key){}

public int q0;

public int q;

public void fun0()

{

Console.WriteLine(“class X, function fun0()”);

q = 125;

}

public void fun1()

{

Console.WriteLine(“class X, function fun1()”);

}

}

class Y:X

{

public Y(int key){}

public Y():base(125){}

new public int q; // Если опустить модификатор new -

new public void fun1() // появится предупреждение об ожидаемом new...

{

base.fun1(); // Обращение к переопределённым членам базового класса.

base.q = 125;

Console.WriteLine(“class Y, function fun1()”);

}

static void Main(string[] args)

{

Y y0 = new Y();

Y y1 = new Y(125);

// А извне переопределённые члены базового класса не видны.

y0.fun1();

y0.q = 100;

y0.fun0();

y0.q0 = 125;

}

}

}

Объявление класса может содержать вложенное объявление класса. C# допускает и такие объявления:

class X

{

public class XX

{

}

}

Так вот одновременное включение явного объявления класса или структуры с одним и тем же именем в базовый и производный классы также требует явной спецификации с помощью модификатора new:

class X

{

public class XX

{

}

}

class Y:X

{

new public class XX

{

}

}

Модификатор new используется при переопределении общедоступных объявлений и защищённых объявлений в производном классе для явного указания факта переопределения.