真实生活中使用new关键字隐藏虚拟方法实现?c#

真实生活中使用new关键字隐藏虚拟方法实现?c#,c#,overriding,virtual,new-operator,C#,Overriding,Virtual,New Operator,我们将使用new为派生类中的虚拟方法提供新实现的真实场景是什么?C# 我知道这在技术上意味着什么。我所寻找的是一个现实生活中的场景,在那里这将是必要的 我们总是可以通过提供覆盖功能来实现同样的目标。为什么我们希望在方法调用被转换为base时选择不正确的方法。否。您无法实现相同的效果 // Define the base class class Car { public virtual void DescribeCar() { System.Console.Writ

我们将使用new为派生类中的虚拟方法提供新实现的真实场景是什么?C#

我知道这在技术上意味着什么。我所寻找的是一个现实生活中的场景,在那里这将是必要的


我们总是可以通过提供覆盖功能来实现同样的目标。为什么我们希望在方法调用被转换为base时选择不正确的方法。

否。您无法实现相同的效果

// Define the base class
class Car
{
    public virtual void DescribeCar()
    {
        System.Console.WriteLine("Four wheels and an engine.");
    }
}

// Define the derived classes
class ConvertibleCar : Car
{
    public new virtual void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("A roof that opens up.");
    }
}

class Minivan : Car
{
    public override void DescribeCar()
    {
        base.DescribeCar();
        System.Console.WriteLine("Carries seven people.");
    }
}
现在,如果您尝试这样做:

public static void TestCars2()
{
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
}
结果将是:

Car object: YourApplication.Car

Four wheels and an engine.

----------

Car object: YourApplication.ConvertibleCar

Four wheels and an engine.

----------

Car object: YourApplication.Minivan

Four wheels and an engine.

Carries seven people.

----------
Override始终重写,而new仅在用作其声明类型(而不是基类型)时才执行重写

您可以

不,您不能通过覆盖:

  • 通过指定新方法,可以更改返回类型
  • 调用基本方法可能不正确
一个示例场景:

  • 您正在使用第三方库Foo,它包含一个类FooBase
  • 您可以编写自己的Foo,Bar子类
  • 您在Bar中引入了一个名为DoSomething的公共方法
  • 在Foo的下一个版本中,第三方在Foo中引入了一个DoSomething方法,该方法与您的方法不同。这可能是虚拟的,也可能不是虚拟的
此时,您希望所有调用Bar.DoSomething的现有代码仍调用Bar.DoSomething,但所有调用Foo.DoSomething的代码仍应调用该实现-这些调用方可能甚至不知道您的方法,并且可能位于第三方程序集中

从长远来看,在这种情况下,如果可以的话,您可能希望重命名您的方法(取决于您对调用方的控制程度),但从短期来看,将您的方法设为
新的
可以完全实现您想要的行为


这类问题有时被称为脆性基类问题。埃里克·利珀特(Eric Lippert)对此进行了相当广泛的论述,其中包括。

可以重新定义虚拟方法。virtual关键字指定在派生类中重写的方法。我们可以添加派生类型,而无需修改程序的其余部分。因此,对象的运行时类型决定了行为。

最好在上讨论,我在寻找真实场景。这是本书的主题。。无论如何,Jon给出的脆性基底secenerio回答了这个问题,但这不是一个需要它的例子。