为什么隐藏方法无法在c#中工作

时间:2015-07-30 07:37:54

标签: c#

考虑以下代码:

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

2 个答案:

答案 0 :(得分:1)

  

我的问题是,当我们致电a.Method1()时,我得到A.Method1而不是b.Method1。为什么方法隐藏不起作用。

因为我们调用类A的常规非虚方法。 new修饰符不会更改行为,只会抑制警告:

  

'...'隐藏继承成员'...'。如果想要隐藏,请使用new关键字。

请参阅Knowing When to Use Override and New Keywords

答案 1 :(得分:0)

new关键字上的内容是,仅当您创建派生类型的引用时,它才有效,即B。但是,当您将B的引用引用到类型A的对象时,将使用默认实现。 话虽如此,以下内容也适用于您的代码:

A a = b;
((B)a).Method1();

这会导致B.Method1被调用。

但是,如果Method2类型中的Avirtual,则会调用实际覆盖B.Method2