При объявлении членов производного класса в 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 используется при переопределении общедоступных объявлений и защищённых объявлений в производном классе для явного указания факта переопределения.