当没有覆盖产生警告并覆盖时,为什么覆盖关键字会产生错误?

时间:2016-03-21 02:47:12

标签: c# inheritance override

下面的代码会产生错误并且无法编译。但是当我们删除override关键字时,它只会产生警告,编译甚至覆盖。

有合理的解释吗?

class Baseclass
{
    public void fun()
    {
        Console.WriteLine("Hi ");
    }

    public void fun(int i)
    {
        Console.Write("Hello ");
    }
}


class Derived : Baseclass
{
    public override void fun()
    {
        Console.Write("Bye ");
    }
}


class MyProgram
{
    static void Main(string[] args)
    {
        Derived d;
        d = new Derived();
        d.fun();
        d.fun(77);
        Console.Read();
    }
} 

2 个答案:

答案 0 :(得分:2)

在C#中,您只能覆盖标记为虚拟的方法。试试这个

class Baseclass
{
    public virtual void fun()
    {
        Console.WriteLine("Hi ");
    }
}


class Derived : Baseclass
{
    public override void fun()
    {
        Console.Write("Bye ");
    }
}

当你将override放在函数签名中时,compile需要在基类中匹配的虚拟方法(签名和返回类型)不存在,因此会引发错误。

当您删除覆盖关键字时,实际隐藏了BaseClass的方法但不会覆盖该方法。在这种情况下,编译器仅引发警告并继续编译。

覆盖和隐藏之间略有不同请参阅Overriding vs method hiding了解更多详情

答案 1 :(得分:0)

C#包含一个关键字virtual,允许您在派生类中标记要覆盖的成员。

文档中陈述的原因是:

  

默认情况下,方法是非虚拟的。您无法覆盖非虚方法。

为什么语言设计者会这样做,你必须明确说明方法可以被覆盖?我不能代表他们,但似乎很明显他们想给程序员一个安全的方法来避免错误地压倒成员。这似乎是最明显的胜利。

因此,在设计课程时,您应该将您认为有用的课程标记为虚拟课程。

您可以在MSDN上阅读更多内容。

所以你的Baseclass看起来像这样:

class Baseclass
{
    public virtual void fun()
    {
        Console.WriteLine("Hi ");
    }

    public void fun(int i)
    {
        Console.Write("Hello ");
    }
}

当然,您也可以将virtual添加到重载方法中,同时使用int。