关于New关键字隐藏基类的用途的疑问
本帖最后由 hymhblf 于 2013-01-12 08:48:34 编辑 对于New关键字,它有一个作用就是可以隐藏基类的方法,比如以下的代码:
public class Car
{
public virtual void Start()
{
Console.WriteLine("车在启动。。。。。");
}
}
public class Train : Car
{
public void Start() //这个地方因为没有加New,所以会报一个警告
{
Console.WriteLine("火车在启动。。。。。");
}
}
public class Bicycle : Car
{
new public void Start()
{
Console.WriteLine("自行车在启动。。。。。");
}
}
class Program
{
static void Main(string[] args)
{
Car car = new Car();
car.Start();
Train train = new Train();
train.Start();
Bicycle bicycle = new Bicycle();
bicycle.Start();
car = (Car)bicycle;
car.Start();
Console.ReadLine();
}
}
随着系统的演变,出现了 Bicycle ,从概念上讲 Bicycle 与 Car 是一样的,都需要 Start,此时会 继承 Car,但是 Bicycle 的行为与 Car 是不一样的,所以原来的 Start 需要修改其行为,这时就会用到 new 关键字。
假如将 Bicycle 以 Car 的身份在原系统中运行,那么 Bycycle 的行为与 Car 的行为是一致的,而不是修改后的行为,这样就保证了 里氏替换原则 的实现。
这就是为什么 ((Car)bicycle).Start() 的结果依然是 “车在启动。。。。。”,而不是“自行车在启动。。。。。”的原因。
new 关键字的目的,就是为了保证原系统的行为不会因为子类的加入而发生改变,也就是“里氏替换原则”。
虚方法 和 抽象方法,他们的行为在子类中是可以修改的,这种修改将直接影响到父类(也就是原有系统逻辑),甚至出现子类在新系统中运行正常,而在旧系统中发生错误的可能性,所以这两种方法无法保证“里氏替换原则”的实现。
以上是个人对 new、虚方法 和 抽象方法的一些看法。