C#中的一个方法可以覆盖另一个方法,同时是虚拟的吗?

C#中的一个方法可以覆盖另一个方法,同时是虚拟的吗?,c#,inheritance,overriding,virtual,C#,Inheritance,Overriding,Virtual,抱歉,如果这是一个愚蠢的问题,或者已经被问过了;我试过在谷歌上搜索,但我现在还不能测试这个。。。下面是: 想象一下这个场景: public class Bottom { virtual public void foo() { doTheThing(); } } public class Middle : Bottom { virtual override public void foo() //this function will both ov

抱歉,如果这是一个愚蠢的问题,或者已经被问过了;我试过在谷歌上搜索,但我现在还不能测试这个。。。下面是:

想象一下这个场景:

public class Bottom
{
    virtual public void foo()
    {
        doTheThing();
    }
}

public class Middle : Bottom
{
    virtual override public void foo() //this function will both override the parent's foo() and letting its child's foo() be over ridden
    {
        base.foo();
        doTheOtherThing();
    }
}

public class Top : Middle
{
    override public void foo() 
    {
        base.foo();
        doTheFinalThing();
    }
}
中间那个有评论的就是我要问的那个


这样做行吗?这是传统的吗?关键词的顺序是否正确?这有关系吗?最正确的方法是什么?

底层基类中定义的虚拟方法意味着该方法是虚拟的,对该方法的调用将执行最派生的实现。此行为由所有重写继承

这意味着您只需要指定“override”关键字。基本方法已经确保它是虚拟的,因此不需要在重写中再次指定它。编译器甚至不允许你这么做


此外,许多人会争辩说,你应该“偏爱组合而不是继承”,但这是另一种讨论。像您这样执行多个覆盖是正确的。

虚拟方法一直都是虚拟的,您不需要为此做任何事情。所以,只需从中间版本中删除“virtual”关键字。在您询问之前,请尝试编译您感兴趣的代码。您的代码当前将出现编译时错误,因此这显然不是“可以做的事”。请检查:“您不能使用新的、静态的或虚拟的修饰符来修改重写方法……重写的属性必须是虚拟的、抽象的或重写的。”我现在很确定我理解了。谢谢各位--