关于c#:为什么虚拟函数不能重写抽象函数?


C# - Why can't a virtual function override an abstract function?

本问题已经有最佳答案,请猛点这里访问。

请考虑以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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());
        }
    }
}

当我试图编译代码时,我得到了"public virtual override string speak()"方法的"override cannot be marked as new or virtual"错误。我知道有很多方法可以解决这一问题,但我想知道C的推理是什么,不允许虚拟机覆盖抽象。


重写其基方法的方法是隐式虚拟的(除非用sealed关键字另外指定),您不需要指定它。


来自MSDN

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