我对如何解析非虚拟方法的理解(在 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
这对我来说没有意义,我相信会让很多人陷入困境。如果您现在将变量车辆声明为 VehicleBase 类型,您将得到
Sedan.ShiftIntoGear
VehicleBase.Accelerate
Sedan.Steer
VehicleBase.Accelerate
这也是我在前一种情况下所期望的,因为方法 Accelerate 是非虚拟的。
在前面的输出中,(变量车辆类型为 Sedan,我希望调用 Sedan.Accelerate 而不是 VehicleBase.Accelerate。就目前而言,取决于您从哪里调用它(从类中或从外部)行为正在改变。
在我看来,重新引入方法的重载解决规则优先,但我很难相信这是正确/预期的行为。