为什么隐藏方法不能在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

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

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

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

"……'隐藏继承的成员'…'。如果要隐藏,请使用new关键字。

参见知道何时使用覆盖和新关键字。

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

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

导致B.Method1被调用。

但是,由于类型A中的Method2virtual,因此调用实际覆盖的B.Method2