我的朋友问我抽象方法是否可以有虚拟修饰符。我说,不。 因为, 抽象方法也隐式也是虚方法,因此不能将修饰符设置为虚拟。
但在阅读one of the MSDN articles时,我已经看到了这一点:
... 如果虚拟方法被声明为抽象,则它仍然是虚拟的 继承自抽象类的类。继承一个类 抽象方法无法访问原来的实现 方法 - 在前面的例子中,F类上的DoWork无法调用DoWork 在类D上。这样,抽象类可以强制派生类 为虚拟方法提供新的方法实现....
我无法正确理解第一句话。你能不能解释一下他们想说什么?
感谢。
答案 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.DoWork
由E
继承,并在那里声明为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()
是虚拟的和抽象的。