如果虚方法被声明为抽象的

本文关键字:抽象的 声明 方法 如果 | 更新日期: 2023-09-27 18:19:18

我的朋友问我一个抽象方法是否可以有虚拟修饰符。我说,。因为抽象方法隐式地也是虚方法,所以它不能有修饰符virtual。

但是在阅读MSDN的一篇文章时,我看到了这个:

…如果声明方法abstract,则该方法对任意对象仍然是虚的从抽象类继承的类。类继承类的原始实现方法——在前面的例子中,类F上的DoWork不能调用DoWork通过这种方式,抽象类可以强制派生类为虚拟方法提供新的方法实现....

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

谢谢。

如果虚方法被声明为抽象的

当您查看引号上方的代码示例时,它变得更加清晰:

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成员覆盖virtual成员:

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()既是虚拟的又是抽象的。