考虑以下代码:
public class A
{
public void Method1()
{
Console.WriteLine("A.Method1");
}
public virtual void Method2()
{
Console.WriteLine("A.Method2");
}
}
public class B : A
{
public new void Method1()
{
Console.WriteLine("b.Method1");
}
public override void Method2()
{
Console.WriteLine("b.Method2");
}
}
和此:
B b = new B();
b.Method1();
b.Method2();
Console.WriteLine("*********************");
A a = b;
a.Method1();
a.Method2();
这是我的结果:
b.Method1
b.Method2
A.Method1
b.Method2
我的问题是为什么当我们调用a.Method1()时,我得到A.Method1而不是b.Method1。为什么方法隐藏不起作用。
注意此行:a = b
答案 0 :(得分:1)
我的问题是,当我们致电
a.Method1()
时,我得到A.Method1
而不是b.Method1
。为什么方法隐藏不起作用。
因为我们调用类A
的常规非虚方法。 new
修饰符不会更改行为,只会抑制警告:
'...'隐藏继承成员'...'。如果想要隐藏,请使用new关键字。
答案 1 :(得分:0)
new
关键字上的内容是,仅当您创建派生类型的引用时,它才有效,即B
。但是,当您将B
的引用引用到类型A
的对象时,将使用默认实现。
话虽如此,以下内容也适用于您的代码:
A a = b;
((B)a).Method1();
这会导致B.Method1
被调用。
但是,如果Method2
类型中的A
为virtual
,则会调用实际覆盖B.Method2
。