この背後にある設計上の根拠は何ですか:
わかった:
public class A
{
public virtual void DoWork() { Console.WriteLine("A"); }
}
public class B : A
{
private new void DoWork() { Console.WriteLine("B"); } //private works
}
public class C : B
{
public override void DoWork() { Console.WriteLine("C"); }
}
違う:
public class A
{
public virtual void DoWork() { Console.WriteLine("A"); }
}
public class B : A
{
public new void DoWork() { Console.WriteLine("B"); } //public doesn't
}
public class C : B
{
public override void DoWork() { Console.WriteLine("C"); }
}
とにかく非仮想メソッドが仮想メソッドのオーバーライドを妨げるのはなぜですか?
編集:詳細な説明。最初のケース: コンパイラは、メソッドがプライベート (新規) であることを確認するため、クラス C.DoWork() がクラス A.DoWork() をオーバーライドできるようにします (仮想メソッドと非仮想 (B.DoWork()) メソッドを混在させません)。2 番目のケース: コンパイラは public (new) void が宣言されていることを認識し、クラス C でのオーバーライドを任意に (?) 妨害します。シール指定子を使用することもできました。ただし、この場合、通常の非仮想メソッドを宣言するものとして public void DoWork() を記述しましたが、プライベート ケースのように仮想継承チェーンに参加することは期待していません。2番目の例では、次のことを期待しています:
A ac = new C();
ac.DoWork();
プライベートケースのように C を出力します。