用虚拟方法覆盖抽象方法

时间:2014-02-18 15:23:05

标签: c# inheritance virtual abstract

我正在尝试使用子类中的虚方法覆盖抽象类中的抽象方法。我(假设到现在?)了解抽象方法和虚方法之间的区别。

显然我无法做到,但我的问题是......为什么?根据接受的答案here和以下情况,我只是看不到问题:

    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.
    }

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

  

“虚拟功能,基本上就是说看,这是功能   这对孩子班级来说可能是也可能不够好。如果是的话   足够好,使用此方法,如果没有,然后覆盖我,并提供   你自己的功能。“

并且第二级子级将从其父级继承虚拟方法,从而满足抽象方法从其最顶级父级的实现要求......问题是什么?

我在某个地方遗漏了一些妨碍我对此理解的细节...

2 个答案:

答案 0 :(得分:15)

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
}

答案 1 :(得分:4)

abstract方法已经 virtual一直沿着继承链 - 没有必要在子类中声明它virtual以允许子类覆盖它 - 子类可以已经覆盖它。

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