答案 0 :(得分:4)
没有
在C#中,您使用new来隐藏/隐藏基类的非虚函数。您需要在C#中使用此关键字,因为您无法覆盖非虚拟的函数。
在Java中,默认情况下所有函数都是虚函数,因此您可以始终覆盖它们,并且不需要像new这样的关键字。
希望这有帮助。
答案 1 :(得分:2)
在C#中,您要从baseclase覆盖的任何方法都需要abstract
,virtual
或override
本身。 new关键字确实没有覆盖。它有点不同:
如果使用new-keyword声明一个函数,隐藏一个基类的函数,那么只有当你有一个同一个子类型的对象时才会使用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关键字与典型覆盖的区别: 如果扩展类被转换为父类ClassType,则重写函数(返回Earth而不是World)仍然有效,而新函数不是(Hi不返回而不是Hello)。