为什么隐藏方法不能在c#中工作
本文关键字:工作 不能 隐藏 方法 为什么 | 更新日期: 2023-09-27 18:05:33
考虑以下代码:
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我的问题是为什么当我们调用
a.Method1()
时,我得到A.Method1
而不是b.Method1
。为什么方法隐藏不起作用
因为我们调用A
类的一个常规的非虚方法。new
修饰符不改变行为,它只是抑制警告:
"……'隐藏继承的成员'…'。如果要隐藏,请使用new关键字。
参见知道何时使用覆盖和新关键字。
关于new
关键字的事情是,只有当您创建派生类型的引用(即B
)时,它才有效。但是,当您将B
的引用引用到A
类型的对象时,将使用默认实现。话虽如此,以下代码也适用于您的代码:
A a = b;
((B)a).Method1();
导致B.Method1
被调用。
但是,由于类型A
中的Method2
是virtual
,因此调用实际覆盖的B.Method2