非仮想メソッドがどのように解決されるかについて (C# で) 私の理解では、それは (インスタンスの型ではなく) 変数の型に依存するということです。
以下のコードを見てください。
class Program
{
static void Main(string[] args)
{
Sedan vehicle = new Sedan();
vehicle.Drive();
vehicle.Accelerate();
}
}
abstract class VehicleBase
{
public void Drive()
{
ShiftIntoGear();
Accelerate();
Steer();
}
protected abstract void ShiftIntoGear();
protected abstract void Steer();
public void Accelerate()
{
Console.WriteLine("VehicleBase.Accelerate");
}
}
class Sedan : VehicleBase
{
protected override void ShiftIntoGear()
{
Console.WriteLine("Sedan.ShiftIntoGear");
}
protected override void Steer()
{
Console.WriteLine("Sedan.Steer");
}
public new void Accelerate()
{
Console.WriteLine("Sedan.Accelerate");
}
}
コンソール ウィンドウには次のように表示されます。
Sedan.ShiftIntoGear
VehicleBase.Accelerate
Sedan.Steer
Sedan.Accelerate
これは私には意味がありません。多くの人をループに陥れると思います。変数 vehicle を VehicleBase 型として宣言すると、次のようになります。
Sedan.ShiftIntoGear
VehicleBase.Accelerate
Sedan.Steer
VehicleBase.Accelerate
メソッド Accelerate は非仮想であるため、これは前のケースでも予想されることです。
前の出力では、(セダンとして型指定された変数 vehicle を使用して、VehicleBase.Accelerate の代わりに Sedan.Accelerate が呼び出されることを期待します。現在のところ、どこから呼び出すかによって異なります (クラス内から、または外部から)行動が変化しています。
再導入されたメソッドのオーバーロード解決規則が優先されているように思えますが、これが正しい/予期される動作であるとは信じがたいです。