方法可以是抽象的但不是虚拟的吗?

时间:2013-02-20 13:07:03

标签: c#

据我了解,标记为抽象的方法是隐式虚拟的。原因:假设给定对象的编译时类型是抽象的。如果正在调用对象的一个​​抽象方法,则要执行的实际方法是在对象的运行时类型中定义的方法。不是吗?如果我是对的,那么抽象方法的行为就好像它也是虚拟的。

尽管如此,我还是成功地同时标记了一个抽象和虚拟的C#方法:

public abstract virtual void crazy();

我认为这意味着抽象方法不一定是虚拟的,抽象方法实际上与虚拟方法正交。

我出错了什么?抽象方法怎么不是虚拟的?

3 个答案:

答案 0 :(得分:7)

您无法将方法标记为abstractvirtual。这将导致编译器错误:

  

抽象方法'Namespace.Class.Foo()'不能标记为虚拟

问题的其余部分是正确的:abstract方法隐含virtual

答案 1 :(得分:3)

来自MSDN

  • 抽象方法隐式是虚方法。
  • 抽象方法声明仅允许在抽象类中使用。
  • 因为抽象方法声明没有提供实际的实现,所以没有方法体;方法声明只以分号结束,签名后面没有大括号({})。
  • 实现由重写方法提供,该方法是非抽象类的成员。
  • 在抽象方法声明中使用静态虚拟修饰符是错误

答案 2 :(得分:2)

“您不能将virtual修饰符与static,abstract,private或override修饰符一起使用。”