派生类中存在覆盖和隐藏方法.为什么

本文关键字:隐藏 方法 为什么 覆盖 存在 派生 | 更新日期: 2023-09-27 17:53:09

有一个代码示例:

public class A 
{
    public virtual void M()
    {
        Console.WriteLine("A");
    }
}
public class B : A
{
    public override void M()
    {
        Console.WriteLine("B");
    }
}
public class C : B
{
    public new virtual void M()
    {
        Console.WriteLine("C");
    }
}
public class D : C
{
    public override void M()
    {
        Console.WriteLine("D");
    }
}

internal class Program
{
    static void Main()
    {
        C c = new C();
        foreach (var method in typeof (C).GetMethods().Where(_ => _.Name == "M"))
        {
            method.Invoke(c, new object[0]);
        }
        c = new D();
        foreach (var method in typeof(D).GetMethods().Where(_ => _.Name == "M"))
        {
            method.Invoke(c, new object[0]);
        }
    }
}

我得到了被覆盖的方法存在于层次结构中,即使在它被下一个层次结构级别类隐藏的情况下。你能给我解释一下吗?或者直接给我个链接,让我看看?谢谢。

派生类中存在覆盖和隐藏方法.为什么

这就是隐藏某些东西的意思——它仍然存在。

如果c#不允许这种隐藏,他们必须禁止使用已经存在于基类中的方法名。

基类方法仍然存在;否则基类将不再正常工作。只是不能直接从派生它的类实例中访问它:

C c = new C();
c.M(); // returns C
((B)c).M(); // returns B