派生类中存在覆盖和隐藏方法.为什么
本文关键字:隐藏 方法 为什么 覆盖 存在 派生 | 更新日期: 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