为什么抽象方法需要 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”中也有同样的限制不是更好吗?我的意思是在大多数情况下,如果您创建一个与父类中同名的方法,您通常打算覆盖它。所以我认为明确声明 Override/New 对虚拟方法也是有意义的。
这种行为是否有设计方面的原因?
更新: 第二个样本实际上会导致警告。第一个示例显示错误,因为需要子类来实现抽象方法。我没有看到 VS.. 中的警告现在对我来说非常有意义。谢谢。