2017-02-21 93 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

  • 抽象方法是隱式的虛擬方法。
  • 抽象方法聲明只允許在抽象類中使用。
  • 該實現由重寫方法提供。
  • 抽象方法也可以在抽象類中重寫。