我正在尝试使用子类中的虚方法覆盖抽象类中的抽象方法。我(假设到现在?)了解抽象方法和虚方法之间的区别。
显然我无法做到,但我的问题是......为什么?根据接受的答案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.
}
所以很明显我所做的是拥有一个顶级父级,其中包含两个继承子级,另一个类继承自其中一个子级。同样,根据我在上面发布的链接中接受的答案:
“虚拟功能,基本上就是说看,这是功能 这对孩子班级来说可能是也可能不够好。如果是的话 足够好,使用此方法,如果没有,然后覆盖我,并提供 你自己的功能。“
并且第二级子级将从其父级继承虚拟方法,从而满足抽象方法从其最顶级父级的实现要求......问题是什么?
我在某个地方遗漏了一些妨碍我对此理解的细节...
答案 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
以允许子类覆盖它 - 子类可以已经覆盖它。
如果不提供实现,将使用最接近的实现(向下查看继承列表)。