关于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 = new Bicycle();我本类就是创建的子类,就是以它自己去调用自身的方法,它就应该是这样输出,所以在此我不明白它隐藏基类的意义何在?
------解决方案--------------------这样直接new ,违反了 里氏替换原则,直接改变基类的方法原有的行为。 这是不推荐的,如果要改变的话,请使用 虚或者抽象通过override来重写。
------解决方案--------------------比如说,你设计了一个叫快餐店的基类,里面允许调用可乐、汉堡、薯条等方法。
另外你有一个地名分区的类,里面有法兰克福、柏林、斯图加特等方法去汇总这些城市的数据。
现在问题来了,有个地方也叫汉堡,那么一个方法中就不得不出现两个汉堡,一个表示地方一个表示食物。他们没有任何关系,那么你就要使用new了。
------解决方案--------------------这个是为了跟微软自己的ms c++兼容,你不要过分遐想。
实际上这是一种垃圾设计,如果去除最好。但是市场强过与个人的爱好,在2000年、2001年那个时代,还是需要强调这些兼容性,所以才有了这种垃圾设计。
实践中,凡是有喜爱这种东西的,我们干脆就把程序员辞掉算了。
------解决方案--------------------以 lz 的代码作为例子,有这么一种情况
系统的原作者并不希望别人修改 Car 的 Start 行为,这时,此方法不会是 虚方法 或者 抽象方法。