真实生活中使用new关键字隐藏虚拟方法实现?c#
我们将使用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
我们总是可以通过提供覆盖功能来实现同样的目标。为什么我们希望在方法调用被转换为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方法,该方法与您的方法不同。这可能是虚拟的,也可能不是虚拟的
新的
可以完全实现您想要的行为
这类问题有时被称为脆性基类问题。埃里克·利珀特(Eric Lippert)对此进行了相当广泛的论述,其中包括。可以重新定义虚拟方法。virtual关键字指定在派生类中重写的方法。我们可以添加派生类型,而无需修改程序的其余部分。因此,对象的运行时类型决定了行为。最好在上讨论,我在寻找真实场景。这是本书的主题。。无论如何,Jon给出的脆性基底secenerio回答了这个问题,但这不是一个需要它的例子。