覆盖C#,使两个后续方法成为虚拟

时间:2015-07-02 07:13:34

标签: c# method-overriding

这是一个覆盖C#的问题。

当我使用以下代码时:

class Program
{


    class A
    {
        public virtual void callme()
        {
            Console.WriteLine("this is A");
        }
    }
    class B : A
    {
        public new virtual void callme()
        {
            Console.WriteLine("this is B");
        }
    }
    class C : B
    {
        public override void callme()
        {
            Console.WriteLine("this is C");
        }
    }


    static void Main(string[] args)
    {
        A obj = new C();
        obj.callme();
        Console.ReadKey();
    }
}

输出: This is A

当我使用时:

class Program
{


    class A
    {
        public virtual void callme()
        {
            Console.WriteLine("This is A.");
        }
    }
    class B : A
    {
        public override void callme()
        {
            Console.WriteLine("This is B.");
        }
    }
    class C : B
    {
        public override void callme()
        {
            Console.WriteLine("This is C.");
        }
    }


    static void Main(string[] args)
    {
        A obj = new C();
        obj.callme();
        Console.ReadKey();
    }
}

输出: This is C.

因此,如果我在后续类(A以及B)中创建一个虚拟方法,为什么它调用最后一个方法,如果B类重写{{ 1}}和A覆盖C然后调用B的方法。

请解释。

2 个答案:

答案 0 :(得分:2)

在第一种情况下,B是阴影A而C则覆盖B中的阴影。因此,只要参考类型为A,它就会调用A方法。

在第二种情况下,B覆盖A,C覆盖B(因此覆盖A)。

请参阅:Differences Between Shadowing and Overriding

答案 1 :(得分:1)

检查编译器警告:

  

警告1' .. Program.B.callme()'隐藏继承的成员   ' .. Program.A.callme()&#39 ;.使当前成员覆盖该成员   实现,添加override关键字。否则添加新的   关键词。 .. \ Program.cs 44 33测试

它声明B中的方法隐藏了A中的方法。当你在C中覆盖方法时;它只是覆盖B中的方法而不是A中的方法(编译器假定您在B类中callme是一个新方法)。因此,当您致电A.callme时,由于A中的方法未被覆盖,因此返回"这是A"。