考虑下面的代码: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