【问题标题】:Can a method in C# override another method and be virtual at the same time?C# 中的方法可以覆盖另一个方法并同时是虚拟的吗?
【发布时间】:2016-11-03 11:31:09
【问题描述】:

对不起,如果这是一个愚蠢的问题或已经被问过;我试过用谷歌搜索,但我现在还不能真正测试这个......所以这里是:

想象一下这个场景:

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();
    }
}

带有评论的中间那个是我要问的那个。

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

【问题讨论】:

  • 虚拟方法一直是虚拟的,你不需要为此做任何事情。所以只需从中间版本中删除“虚拟”关键字。
  • 在你问之前,请尝试编译你感兴趣的代码。你的代码目前会给出一个编译时错误,所以这显然不是“一件好事”。
  • 检查documentation:“您不能使用new、static或virtual修饰符来修改覆盖方法....被覆盖的属性必须是virtual、abstract或override。”跨度>
  • 我现在明白了。谢谢大家——

标签: c# inheritance overriding virtual


【解决方案1】:

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

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

此外,许多人会争辩说您应该“赞成组合而不是继承”,但这是另一个讨论。像你一样进行多次覆盖是可以的,而且是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2018-01-28
    • 2017-09-08
    • 2018-06-12
    • 2012-10-26
    • 1970-01-01
    • 2013-01-15
    相关资源
    最近更新 更多