【发布时间】:2017-07-11 05:09:00
【问题描述】:
考虑以下代码:
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());
}
}
}
当我尝试编译代码时,使用“公共虚拟覆盖字符串 Speak()”方法出现“无法将覆盖标记为新的或虚拟的”错误。我知道有一些解决方法,但我想知道 C# 不允许虚拟覆盖抽象背后的原因是什么。
【问题讨论】:
-
让我问你一个不同的问题:在那种情况下,通过将其标记为
virtual来达到什么目的? -
Speak()已经是一个虚拟方法 -
目的是允许继承 basePetClass 的类选择覆盖或使用 base.Speak()。 absMammalClass 不知道或不关心 Speak() 是如何实现的,但 basePetClass 需要提供默认定义。
标签: c#