Довольно смутно с правилами виртуального наследования, когда у меня есть метод, который предотвращает переопределение производного класса из виртуального метода, определенного в базовом классе. Вот немного кода, чтобы объяснить мою проблему лучше:Виртуальное наследование в C#
using System;
namespace ConsoleApplication1
{
public class A
{
public virtual void DoWork()
{
Console.WriteLine("A.DoWork()");
}
}
public class B : A
{
public override void DoWork()
{
Console.WriteLine("B.DoWork()");
}
}
public class C : B
{
public sealed override void DoWork()
{
Console.WriteLine("C.DoWork()");
}
}
public class D : C
{
public new void DoWork()
{
Console.WriteLine("D.DoWork()");
}
}
public class MyMainClass
{
public static void Main()
{
B b = new D();
b.DoWork();
C c = new D();
c.DoWork();
A a = new D();
a.DoWork();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
ВЫВОД
C.DoWork()
C.DoWork()
C.DoWork()
Нажмите любую клавишу для выхода
Это правда, что если переменная типа B используется для доступа к экземпляру C, так как B b = new C();
b.DoWork()
приведет к в вызове реализации Cи для DoWork() поскольку С переопределяет виртуальный DoWork() из A.
Но почему это, когда переменная типа C, B, или A используется для доступа экземпляр D, как
B b = new D();
C c = new D();
A a = new D();
вызов DoWork() для каждого из них вызовет реализацию DoWork() для класса C?
@PrestonGuillot, вероятно, не - выглядит как OP просто не понимают 'virtual' и вопрос просто случайно упомянуть' sealed'/new' ' , –
Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что OP пытается сделать противоположный тому, на каком языке был создан –
Как и http://stackoverflow.com/questions/4152049/sealed-method-in-c- sharp –