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

本文关键字:虚拟 隐藏 方法 实现 关键字 new 生活 | 更新日期: 2023-09-27 18:03:48

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

我知道这在技术上是什么意思。我正在寻找的是一个真实的生活场景,这将是需要的。

我们总是可以通过提供覆盖功能来实现相同的目的。

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

当方法调用被强制转换为基类时,为什么要选择错误的方法呢?

No。你不可能达到同样的效果。

// 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 ALWAYS Override,而new只在作为声明类型(不是基类型)使用时才这样做。

你可以在这里看到更多

不,您不能通过重写达到相同的效果:

  • 指定一个新方法允许你改变返回类型
  • 调用基方法不一定是不正确的

一个示例场景:

  • 你正在使用第三方库Foo,它包含一个类FooBase
  • 你自己写Foo的子类,Bar
  • 你在Bar中引入了一个叫做DoSomething的公共方法
  • 在Foo的下一个版本中,第三方在Foo中引入了一个DoSomething方法,该方法与你的方法不同。
此时,您希望所有现有的代码都调用Bar。DoSomething to still call Bar。DoSomething,但是所有调用Foo的代码。DoSomething仍然应该调用那个实现——那些调用者可能连都不知道关于你的方法,而且他们可能在第三方程序集中。

在这种情况下,如果可以的话,你可能想要重命名你的方法(取决于你对调用者的控制程度),但在短期内,使你的方法作为new可以实现你想要的行为。

这种事情有时被称为脆性基类问题。Eric Lippert已经写了相当多的关于它的文章,包括2004年的这篇文章。

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