Основа реализации принципа полиморфизма – наследование. Ссылка на объект базового класса, настроенная на объект производного может обеспечить выполнение методов ПРОИЗВОДНОГО класса, которые НЕ БЫЛИ ОБЪЯВЛЕНЫ В БАЗОВОМ КЛАССЕ. При реализации принципа полиморфизма происходят вещи, которые не укладываются в ранее описанную схему.
Одноимённые функции с одинаковой сигнатурой в базовом и производном классах: между ними может быть установлено отношение замещения. Замещаемая функция базового класса должна при этом дополнительно специфицироваться спецификатором virtual.
Отношение замещения между функциями базового и производного класса устанавливается, если соответствующая (одноименная функция с соответствующей сигнатурой) функция производного класса специфицируется дополнительным спецификатором override.
Введём следующие обозначения и построим схему наследования.
Спецификация и заголовок функции- члена
Уровень наследования
Обозначение
public void F(){ }
public virtual void F() { }
new public virtual void F() { }
1..N
new public void F() { }
1..N
public override void F() { }
1..N
Схема возможных вариантов объявления методов в иерархии наследования трёх уровней.
Наконец, замечательный пример,
using System;
namespace Implementing
{
class A
{
public virtual void F() { Console.WriteLine(“A”);}
}
class B:A
{
public override void F() { Console.WriteLine(“B”); }
}
class C:B
{
new public virtual void F() { Console.WriteLine(“C”); }
}
class D:C
{
public override void F() { Console.WriteLine(“D”); }
}
class Starter
{
static void Main(string[] args)
{
D d = new D();
C c = d;
B b = c;
A a = b;
d.F(); /* D */
c.F(); /* D */
b.F(); /* B */
a.F(); /* B */
}
}
}
в котором становится ВСЁ понятно, если ПОДРОБНО нарисовать схемы классов, структуру объекта-представителя класса D и посмотреть, КАКАЯ ссылка ЗА КАКОЕ место этот самый объект удерживает.