2013-01-16 58 views

回答

4

号在使用新的来隐藏C#/阴影基类的非虚函数。你需要C#中的这个关键字,因为你不能覆盖非虚拟的函数。

在Java中,默认情况下所有函数都是虚拟的,因此您可以随时重写它们,并且不需要关键字,如new。

希望这会有所帮助。

+1

(然后有人去做最后的方法..) – 2013-01-16 08:44:32

2

在C#中,您想要从基数位置覆盖的任何方法需要为abstract,virtualoverride本身。新关键字实际上不会覆盖。它有点不同:

如果你用new关键字声明了一个函数,隐藏了一个基类的函数,THIS实现将只在你有一个相同的子类型的对象时使用。例如:

class TopClass 
    { 
     public String getHello() 
     { 
      return "Hello"; 
     } 

     public virtual String getWorld() 
     { 
      return "World"; 
     } 
    } 

    class ChildClass : TopClass 
    { 
     public new String getHello() 
     { 
      return "Hi"; 
     } 

     public override string getWorld() 
     { 
      return "Earth"; 
     } 
    } 

这将导致:

 TopClass tc = new TopClass(); 
     Console.WriteLine(tc.getHello() + " " + tc.getWorld()); // Hello World 

     ChildClass cc = new ChildClass(); 
     Console.WriteLine(cc.getHello() + " " + cc.getWorld()); // Hi Earth 

     TopClass tc2 = new ChildClass(); 
     Console.WriteLine(tc2.getHello() + " " + tc2.getWorld()); // Hello Earth 

     Console.ReadLine(); 

你可以看到相比于典型的覆盖new关键字的区别: 如果扩展的类浇铸为父母类类别,最重要的函数(返回地球而不是世界)将仍然有效,而新函数不是(Hi不返回而是Hello)。

+0

+1的例子。有关基类方法在转换为泛型(topclass)类型时的使用方法。 – Destrictor

相关问题