在C#中重写,使后面的两个方法成为虚拟方法

本文关键字:方法 两个 虚拟 重写 | 更新日期: 2023-09-27 18:00:41

这是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.

因此,如果我在后面的类(AB)中使一个方法成为虚拟的,为什么它调用最后一个方法,如果B类覆盖AC覆盖B,那么它调用C的方法。

请解释。

在C#中重写,使后面的两个方法成为虚拟方法

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

在第二种情况下,B覆盖A,C覆盖B(所以它覆盖A)。

请参阅:遮蔽和覆盖之间的差异

检查编译器警告:

警告1'。。Program.B.callme()'隐藏继承的成员'。。Program.A.callme()'。若要使当前成员重写实现,添加override关键字。否则添加新的关键字。。''程序.cs 44 33测试

它声明B中的方法隐藏A中的方法。当您覆盖C中的方法时;它只是覆盖B中的方法而不是A中的方法(编译器假设B类中的callme是一个新方法)。因此,当您调用A.callme时,由于A中的方法没有被覆盖,它会返回"this is A"。