总是有人整这个new,好烦。这中代码在我们的开发中严格禁止。如果你明知道fill这个方法名称与父类冲突而不得不要写上new,你为什么不为fill换一个名称?你明明知道这个fill跟父类的fill毫无关系,为什么要刻意地起同样的名称?

解决方案 »

  1.   

    这个new,来自于十几年前.net对c++的继承。是个.net少有的糟粕设计。应该避免。
      

  2.   

    最后,这根本不是什么“方法重写”。你不得不写上了new,这已经说明了问题。这就好象是“伪娘”,外表上看似是娘儿们,实际上中看不中用。所以你才要必须用new做修饰。它根本不是“重写”,而是不伦不类地新方法,只不过可以用fill这个重复的名称而已。
      

  3.   

    或者直接讲讲Base obj =new Derived()这条语句的含义吧
      

  4.   

    http://blog.csdn.net/bruesz/article/details/2568787
    这里有详细的注释
      

  5.   

    Base obj = new Derived();
    虽然Derived覆盖了Base的方法
    事实上这个对象被当做Base对象(声明Base obj决定)
    所以调用了Base的方法
      

  6.   

    obj是Base类型的变量,当你用obj去调用方法的时候。会去Base类的方法列表中找到相应的方法,所以倒数第二个的结果是Base.fill.那为什么draw方法输出的结果是Derived.draw?因为draw是一个虚方法,当在Base方法中发现draw是一个虚方法时,就会去obj真正指向的对象类型的方法列表里面去找到这个方法,并执行,所以结果是Derived.draw.这就是多态的表现。再往细了去,还可以说得更多。不过楼主可以去看看书clr via c#.