考慮下面的代碼: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#背後的原因是什麼,不允許虛擬來覆蓋摘要。
讓我問你一個不同的問題:你想通過在該場景中標記爲'虛擬'來實現什麼? – MarcinJuraszek
'Speak()'已經是* virtual *方法 –
意圖是允許繼承basePetClass的類選擇重寫或使用base.Speak()。 absMammalClass或者不知道或者不關心Speak()是如何實現的,但是basePetClass需要提供一個默認定義。 – arcadebench