关于C:用虚拟方法重写抽象方法

Overriding an abstract method with a virtual one

我试图用子类中的虚方法重写抽象类中的抽象方法。我(假设到现在为止?)了解抽象方法和虚拟方法之间的区别。

很明显我做不到,但我的问题是…为什么?基于这里接受的答案和下面的场景,我不认为有问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    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.
    }

所以很明显,我所做的是有一个顶级的父类,有两个继承子类,另一个类继承其中一个。同样,基于我在上面发布的链接中接受的答案:

"A virtual function, is basically saying look, here's the functionality
that may or may not be good enough for the child class. So if it is
good enough, use this method, if not, then override me, and provide
your own functionality."

第二级子级继承了父级的虚方法,从而满足了最上层父级抽象方法的实现要求。怎么了?

我遗漏了一些阻碍我理解这一点的细节…


除非标记为sealed,否则override方法是隐式虚拟的(在子类中可以重写)。

观察:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
}


一个abstract方法已经在继承链的整个过程中都是virtual—不需要在子类中声明它virtual以允许子类重写它—子类已经可以重写它。

如果不提供实现,则将使用最近的实现(查看继承列表)。