Следующее должно быть сделано, где мы контролируем поведение при работе с типом в этом типе:
class A
{
public virtual void Render()
{
Console.WriteLine("A");
}
}
class B : A
{
public override void Render()
{
Console.WriteLine("B");
}
}
class C : A
{
public override void Render()
{
Console.WriteLine("C");
}
}
static void Main(string[] args)
{
var myList = new List<A> { new A(), new B(), new C() };
foreach (var a in myList)
{
a.Render();
}
Console.ReadKey();
}
И если вы хотите, чтобы определенное поведение типа было аддитивным к поведению его родителя, то вызовите метод, реализованный в базе, после выполнения вашей собственной логики, например:
class B : A
{
public override void Render()
{
Console.WriteLine("B");
base.Render();
}
}