现实生活中使用new关键字隐藏虚拟方法实现?c#
本文关键字:虚拟 隐藏 方法 实现 关键字 new 生活 | 更新日期: 2023-09-27 18:03:48
我们将在派生类中使用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方法,该方法与你的方法不同。
在这种情况下,如果可以的话,你可能想要重命名你的方法(取决于你对调用者的控制程度),但在短期内,使你的方法作为new
可以实现你想要的行为。
虚方法可以重新定义。virtual关键字指定在派生类中重写的方法。我们可以在不修改程序其余部分的情况下添加派生类型。因此,对象的运行时类型决定了行为。