C#设计:为什么抽象方法需要new/override,而不是虚拟方法?

为什么抽象方法需要new / override,而不是虚拟方法?

样品1:

abstract class ShapesClass
{
    abstract public int Area(); // abstract!
}

class Square : ShapesClass
{
    int x, y;

    public int Area() // Error: missing 'override' or 'new'
    {
        return x * y;
    }
}

编译器将显示此错误:
要使当前成员覆盖该实现,请添加override关键字.否则添加新关键字

样品2:

class ShapesClass
{
    virtual public int Area() { return 0; } // it is virtual now!
}

class Square : ShapesClass
{
    int x, y;

    public int Area() // no explicit 'override' or 'new' required
    {
        return x * y;
    }
}

这将通过默认隐藏方法来编译.

我完全明白技术差异.不过我不知道为什么语言是这样设计的.对“样品2”也有同样的限制吗?我的意思是在大多数情况下,如果您创建一个与父类名称相同的方法,那么通常意图覆盖它.所以我想明确地说明覆盖/新的也将有意义的虚拟方法.

这种行为是否有设计原因?

更新:
第二个样本实际上引起警告.第一个示例显示错误,因为实现抽象方法需要子类.我没有看到VS中的警告,对我来说是完全有道理的.谢谢.

最佳答案
使用.NET 3.5 SP1中提供的C#3.0编译器,或.NET 4.0中提供的C#4.0编译器,我第一个示例会收到以下错误:

error CS0534: ‘ConsoleApplication3.Square’ does not implement inherited abstract member ‘ConsoleApplication3.ShapesClass.Area()’

以及第二个警告:

warning CS0114: ‘ConsoleApplication3.Square.Area()’ hides inherited member ‘ConsoleApplication3.ShapesClass.Area()’. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword.

在第一种情况下,这是一个错误,因为您实际上并没有覆盖基本方法,这意味着在一个具体的类中没有抽象方法的实现.在第二种情况下,这是一个警告,因为代码在技术上是正确的,但编译器怀疑这不是你的意思.这是启用“将警告视为错误”编译设置通常是一个好主意的原因之一.

所以我无法重复你的行为,编译器的行为对我来说是正确的.你使用哪个版本的编译器?

转载注明原文:C#设计:为什么抽象方法需要new/override,而不是虚拟方法? - 代码日志