Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中重写,使两个后续方法虚拟_C#_Overriding - Fatal编程技术网

在C#中重写,使两个后续方法虚拟

在C#中重写,使两个后续方法虚拟,c#,overriding,C#,Overriding,这是一个在C#中压倒一切的问题 当我使用以下代码时: class Program { class A { public virtual void callme() { Console.WriteLine("this is A"); } } class B : A { public new virtual void callme() {

这是一个在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();
    }
}
输出:
这是一个

当我使用:

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();
    }
}
输出:
这是C。

因此,如果我在随后的类(
a
以及
B
)中使一个方法成为虚拟的,为什么它调用最后一个方法,如果
B
类重写
a
,而
C
重写
B
,那么它调用
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”。

这正是您不应忽略编译器警告的原因……“当您在C中重写该方法时,它只会重写B中而不是A中的方法(编译器假定您在类B中调用我是一个新方法)”。。。这是不正确的。在本例中,只有虚方法可以被重写,所以类中的方法被重写(而不是B)。类C刚从类B继承了此方法,而类B从父类A继承了此方法。B中的@Fabjan方法也是虚拟的,请检查问题中的第一个示例,它隐藏了A中的实现。您的假设不正确;无论您是否使用new关键字,B中的方法都是一个新方法,与a中的方法没有任何关系。哦,对不起。没有注意到(再次投票给你)