如果虚拟方法被声明为abstract

时间:2014-08-24 14:19:40

标签: c# oop inheritance polymorphism

我的朋友问我抽象方法是否可以有虚拟修饰符。我说,。 因为, 抽象方法也隐式也是虚方法,因此不能将修饰符设置为虚拟。

但在阅读one of the MSDN articles时,我已经看到了这一点:

  

...   如果虚拟方法被声明为抽象,则它仍然是虚拟的   继承自抽象类的类。继承一个类   抽象方法无法访问原来的实现   方法 - 在前面的例子中,F类上的DoWork无法调用DoWork   在类D上。这样,抽象类可以强制派生类   为虚拟方法提供新的方法实现....

我无法正确理解第一句话。你能不能解释一下他们想说什么?

感谢。

2 个答案:

答案 0 :(得分:7)

当您在引用段落的正上方查看代码示例时,它会变得更加清晰:

public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

虚拟方法D.DoWorkE继承,并在那里声明为abstract。该方法仍然是虚拟的,它刚刚变为抽象

正如您所说,抽象方法总是虚拟的。如果你的朋友仍然不相信,那么这是official quote

  

抽象方法隐含地是一种虚方法。

答案 1 :(得分:1)

抽象类可以覆盖virtual成员abstract成员:

public class B
{
    public virtual void M() { }
}
public abstract class D : B
{
    public abstract override void M();
}
public abstract class D2 : D
{
    public override void M() { }
}

句子说D2 必须覆盖void M(),因为它在D中被声明为抽象。如果它被声明为D2 : B,则这是可选的,但就目前而言,D2必须遵守D中指定的合同,但M()也会表现得像任何其他成员压倒正常的"虚拟成员,因为M()是虚拟的和抽象的。