在派生类中使用new关键字为虚方法提供新实现的真实场景是什么?C#
我知道它在技术上意味着什么。我想要的是一个实际的场景,在这种情况下,需要使用此功能。
我们总是可以通过提供override功能来实现相同的效果。为什么当方法调用被转换为基础时,我们希望选择不正确的方法。
在派生类中使用new关键字为虚方法提供新实现的真实场景是什么?C#
我知道它在技术上意味着什么。我想要的是一个实际的场景,在这种情况下,需要使用此功能。
我们总是可以通过提供override功能来实现相同的效果。为什么当方法调用被转换为基础时,我们希望选择不正确的方法。
不,你不能通过覆盖来实现相同的功能:
一个示例场景:
此时,您希望所有调用Bar.DoSomething的现有代码仍然调用Bar.DoSomething,但调用Foo.DoSomething的所有代码仍然调用该实现-这些调用者甚至可能不知道您的方法,并且它们可能在第三方程序集中。
从长远来看,在这种情况下,您可能需要重命名自己的方法(取决于您对调用者的控制程度),但在短期内,将您的方法设置为new
可以实现您想要的行为。
不行,你无法达到相同的效果。
// 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)仅在其声明类型(不是基类类型)下使用时才这样做。
您可以在此处查看更多信息