"new"修饰符做什么来做出两个bM()的答案; aM(); "B"?

Rsa*_*leh -1 .net c# oop methods inheritance

class A {
    public virtual void M() { Console.Write("A"); }
}

class B: A {
    public override void M() { Console.Write("B"); }
}

class C: B {
    new public virtual void M() { Console.Write("C"); }
}

class D: C {
    public override void M() { Console.Write("D"); }
    static void Main() {
        D d = new D(); 
        C c = d; 
        B b = c; 
        A a = b;
        d.M(); c.M(); b.M(); a.M();
    }
}
Run Code Online (Sandbox Code Playgroud)

我是这个概念的新手,所以详细的答案将不胜感激.

p.s*_*w.g 5

所述new改性剂实质上创建相同名称的新方法,隐藏的同名基方法; 基本方法仍然存在,它只是被隐藏了.您仍然可以通过将其强制转换为基类型来从类外部调用它.从文档:

当用作修饰符时,new关键字显式隐藏从基类继承的成员.

另一方面,override关键字表示将在子类中覆盖基本方法.没有经过覆盖接口就无法调用基本方法.

所以在你的例子中,当你调用b.M()并且a.M()你正在调用M方法时B(它被继承并被覆盖A).另一方面,当你调用d.M()并且c.M()你正在调用一个名为Mon 的完全不同的方法时D(它被继承并被覆盖C).