Это универсальная ссылка для любого объекта производного типа, наследующего данный базовый класс.
using System;
namespace Inheritance_3
{
class X
{//===================================================
public int q0 = 0;
public int q = 0;
public void fun0()
{
Console.WriteLine(“class X, function fun0()”);
}
public void fun1()
{
Console.WriteLine(“class X, function fun1()”);
}
}//===================================================
class Y:X
{//===================================================
new public int q = 0;
new public void fun1()
{
Console.WriteLine(“class Y, function fun1()”);
}
public void fun00()
{
Console.WriteLine(“class Y, fun00()”);
}
}//===================================================
class Z:X
{//===================================================
new public int q = 0;
new public void fun1()
{
Console.WriteLine(“class Z, function fun1()”);
}
public void fun00()
{
Console.WriteLine(“class Z, fun00()”);
}
}//===================================================
class StartClass
{//===================================================
static void Main(string[] args)
{
X x = null; // Просто ссылка!
// Объекты-представители производных классов-наследников.
Y y = new Y(); y.fun0(); y.fun00(); y.fun1();
Z z = new Z(); z.fun0(); z.fun00(); z.fun1();
// Настройка базовой ссылки.
x = y; x.fun0(); x.fun1(); x.q = 100; x.q0 = 125;
x = z; x.fun0(); x.fun1(); x.q = 100; x.q0 = 125;
}
}//===================================================
}
Результат:
class X, fun0()
class Y, fun00()
class Y, fun1()
class X, fun0()
class Z, fun00()
class Z, fun1()
class X, fun0()
class X, fun1()
class X, fun0()
class X, fun1()
Вопросов не будет, если рассмотреть схему объекта-представителя класса Y.
Вот что видно от ссылки на объект класса X, настроенного на объект-представитель производного класса. Схема объекта-представителя класса Z и соответствующий “вид” от ссылки x выглядят аналогичным образом.