日期:2014-05-17  浏览次数:20765 次

关于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 行为,这时,此方法不会是 虚方法 或者 抽象方法。