用虚方法重写抽象方法

8
我正在尝试在子类中使用虚方法覆盖抽象类中的抽象方法。我(直到现在?)理解抽象和虚方法之间的区别。
显然,我无法这样做,但我的问题是...为什么呢?基于此处接受的答案和以下情况,我只是看不到问题所在:
    public abstract class TopLevelParent
    {
        protected abstract void TheAbstractMethod();
    }

    public class FirstLevelChild1 : TopLevelParent
    {
        protected override void TheAbstractMethod()
        {

        }
    }

    public class FirstLevelChild2 : TopLevelParent
    {
        protected virtual override void TheAbstractMethod()
        {
            //Do some stuff here
        }
    }

    public class SecondLevelChild : FirstLevelChild2
    {
        //Don't need to re-implement the method here... my parent does it the way I need.
    }

显然,我所做的是将一个顶级父类与两个继承子类和另一个从其中一个继承的类结合起来。基于我在上面发布的链接中接受的答案:

"虚函数基本上是在说,这里是可能或不可能对子类有足够好的功能性。所以如果它足够好,就使用这个方法,否则,重写我,并提供你自己的功能性。"

第二级子类将从其父类继承虚方法,从而满足其最顶层父类的抽象方法的实现要求……问题在哪里呢?

我似乎缺少某些详细信息,这妨碍了我对此的理解……


你到底遇到了什么错误? - Jonathon Reinhart
一个成员 'WindowsFormsApplication.Form1.FirstLevelChild2.TheAbstractMethod()' 被标记为 override,不能再标记为 new 或 virtual。 - Brandon
2个回答

17

一个override方法在未标记为sealed的情况下,隐式地被视为虚方法(即可在子类中重写)。

观察:

public class FirstLevelChild1 : TopLevelParent
{
    protected override void TheAbstractMethod() { }
}

public class SecondLevelChild1 : FirstLevelChild1
{
    protected override void TheAbstractMethod() { } // No problem
}

public class FirstLevelChild2 : TopLevelParent
{
    protected sealed override void TheAbstractMethod() { }
}

public class SecondLevelChild : FirstLevelChild2
{
    protected override void TheAbstractMethod() { } 
    // Error: cannot override inherited member 
    // 'FirstLevelChild2.TheAbstractMethod()' because it is sealed
}

啊,我明白了。所以在这种情况下,我的虚拟声明基本上是多余的?我只需要将其声明为override,它就像我预期的那样工作了。 - Brandon
+1 我不知道我们可以将方法标记为 sealed :) - Selman Genç

4

抽象方法在继承链上已经是完全的虚拟方法了 - 在子类中不需要声明它为虚拟以便允许子类重写它,子类已经可以重写它。

如果你没有提供一个实现,将会使用最接近(在继承列表中)的实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接