如果虚方法被声明为抽象的
本文关键字:抽象的 声明 方法 如果 | 更新日期: 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.DoWork
由E
继承,并声明为抽象方法。方法仍然是虚拟的,它只是变成了抽象的。
正如你所说的,抽象方法总是虚的。如果你的朋友仍然不相信,这里有一个官方引用:
抽象方法是隐式的虚方法。
抽象类可以用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()
既是虚拟的又是抽象的。