我有两个班级
class A
{
public virtual void Metod1()
{
Console.WriteLine("A.Method1");
}
}
class B : A
{
public new void Metod1()
{
Console.WriteLine("B.Method1");
}
}
然后我编写一些代码来声明这些类的实例,并调用它们的方法
static void Main(string[] args)
{
A a = new B();
a.Metod1();
B b = new B();
b.Metod1();
Console.ReadKey();
}
我给出了以下结果:
A.Method1
B.Method1
但是当我从B类的签名方法1中删除关键字new并运行Main方法时,我得到了相同的结果。 问题:方法签名中的新关键字是否只是为了更好的可读性?
编辑:是否存在我们离不开新关键字的情况?
答案 0 :(得分:7)
new 关键字让代码阅读器知道此方法将隐藏其基础中具有相同名称的方法。即使你忽略它,编译器也会以同样的方式对待它,但是警告你。
由于您将方法声明为 virtual ,因此在编译时会收到此警告:
'B.Metod1()'隐藏继承的成员'A.Metod1()'。要使当前成员覆盖该实现,请添加override关键字。否则添加新关键字。
但是,如果您通过删除虚拟来更改声明:
A
class A {
public void Metod1() {
Console.WriteLine("A.Method1");
}
}
class B: A {
public void Metod1() {
Console.WriteLine("B.Method1");
}
}
仍然会编译,但警告信息是:
'B.Metod1()'隐藏继承的成员'A.Metod1()'。如果隐藏意图,请使用新关键字。
如上所述,以下两种方式:
测试代码
var b=new B();
b.Metod1();
(b as A).Metod1();
将输出:
B.Method1 A.Method1
但是,如果您声明如下:
在B
class A {
public virtual void Metod1() {
Console.WriteLine("A.Method1");
}
}
class B: A {
public override void Metod1() {
Console.WriteLine("B.Method1");
}
}
然后输出为:
B.Method1 B.Method1
这是因为基类的Method1
不仅仅是隐藏而是被覆盖派生类。
如果{<1}}是抽象类中的抽象方法,那么不能只使用 new 的情况是:< / p>
必须在派生类中使用覆盖的代码
Method1
在这种情况下,您不能只使用 new ,因为abstract class A {
public abstract void Metod1();
}
class B: A {
public override void Metod1() { // use `new` instead of `override` would not compile
Console.WriteLine("B.Method1");
}
}
要求派生类覆盖A
。
答案 1 :(得分:6)
Knowing When to Use Override and New Keywords (C# Programming Guide)
在C#中,派生类中的方法可以与方法具有相同的名称 在基类中。您可以使用指定方法的交互方式 new和override关键字。覆盖修改器扩展了基础 class方法,和new修饰符隐藏它。
也
通过使用new,您断言您知道该成员 它修改隐藏从基础继承的成员 类强>
答案 2 :(得分:3)
是的,你是对的,这是为了在这种情况下更好的可读性。
但仔细检查一下,在隐藏基本方法时应该警告不使用new。
您可以在这里阅读更多内容: http://msdn.microsoft.com/en-us/library/vstudio/435f1dw2.aspx