【发布时间】:2011-04-07 18:21:46
【问题描述】:
为什么抽象方法需要 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.. 中的警告现在对我来说非常有意义。谢谢。
【问题讨论】:
-
如果你是对的(还没来得及检查)那么它看起来像是编译器中的一个错误;我希望它在这两种情况下都会发出警告。您使用的是哪个版本的编译器?
-
我不知道为什么你没有收到错误,但是在虚拟覆盖上需要覆盖或新的 IS,并且上面的示例无法编译。
-
我收到一条警告:“警告 3 'Stackoverflow_Test.Square.Area()' 隐藏继承的成员 'Stackoverflow_Test.ShapesClass.Area()'。要使当前成员覆盖该实现,请添加覆盖关键字。否则添加新关键字。”
-
@Phil 您可能正在编译“将警告视为错误”。这不是编译错误,而是编译警告
-
@Rune 你说得对,我总是在编译时打开“警告为错误”而忘记其他人没有!
标签: c# virtual language-design abstract-methods