2017-02-21 89 views
0

考虑下面的代码:C# - 为什么虚拟函数不能覆盖抽象函数?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace TestApp 
{ 
    interface IMammalClass 
    { 
     string Speak(); 
    } 

    public abstract class absMammalClass : IMammalClass 
    { 
     public abstract string Speak(); 
    } 

    public class basePetClass : absMammalClass 
    { 
     public virtual override string Speak() 
     { 
      return "Make Noise"; 
     } 
    } 

    public class DogClass : basePetClass 
    { 
     public override string Speak() 
     { 
      return "Bark"; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      DogClass spot = new DogClass(); 
      Console.Out.WriteLine(spot.Speak()); 
     } 
    } 
} 

当我试图编译代码,我得到一个“覆盖不能被标记为新的或虚拟”与“公共虚拟重写字符串说话()”方法错误。我知道有围绕它的方法,但我想知道C#背后的原因是什么,不允许虚拟来覆盖摘要。

+2

让我问你一个不同的问题:你想通过在该场景中标记为'虚拟'来实现什么? – MarcinJuraszek

+1

'Speak()'已经是* virtual *方法 –

+0

意图是允许继承basePetClass的类选择重写或使用base.Speak()。 absMammalClass或者不知道或者不关心Speak()是如何实现的,但是basePetClass需要提供一个默认定义。 – arcadebench

回答

8

覆盖其基本方法的方法是隐式虚拟的(除非使用sealed关键字指定,否则不需要指定它)。

+0

总之,从关键字“virtual”中删除上面的代码允许它编译。 – arcadebench

3

MSDN

  • 抽象方法是隐式的虚拟方法。
  • 抽象方法声明只允许在抽象类中使用。
  • 该实现由重写方法提供。
  • 抽象方法也可以在抽象类中重写。