【问题标题】:C# - Why can't a virtual function override an abstract function? [duplicate]C# - 为什么虚函数不能覆盖抽象函数? [复制]
【发布时间】: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#


【解决方案1】:

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

【讨论】:

  • 总之,从上面的代码中删除关键字“virtual”可以编译。
  • 没错!对于没有 override 修饰符的方法(或属性等),默认是密封行为,您需要 virtual 关键字来更改它。但是,对于具有 override 修饰符的方法,默认行为是可覆盖的方法,然后您需要附加关键字 sealed 来更改它。在方法(、属性等)级别上,sealed 仅与 override 一起出现。
【解决方案2】:

来自MSDN

  • 抽象方法是隐含的虚拟方法。
  • 抽象方法声明只允许在抽象类中。
  • 实现由一种覆盖方法提供。
  • 抽象方法也可以在抽象类中被覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2015-06-17
    • 1970-01-01
    • 2017-10-30
    • 2014-05-22
    • 2020-08-21
    • 2020-03-12
    • 2012-12-16
    相关资源
    最近更新 更多