2010-02-24 95 views
1

我说过,如果我禁止override/new(Overloads/Shadows)关键字,编译器会生成警告。通常,我设置必要的关键字。如果我禁止“覆盖”会怎么样?

但是如果我忘了它呢?

// >>>> Case A - not virtual property - 
class MyPoint : Point 
{ 
    int X { get; set; } // vs new int X { get; set; } 
} 

// >>>> Case B - virtual property - 
class Foo 
{ 
    virtual int Value { get { return 0; } } 
} 

class Bar : Foo 
{ 
    // vs override/new int Value { get { return 1; } } 
    int Value { get { return 1; } } 
} 

回答

5

然后,您不是覆盖该属性,而是创建一个新的属性,就像使用关键字new一样。

Bar x = new Bar(); 
Foo y = x; 
Console.WriteLine(x.Value); // Uses Bar.Value 
Console.WriteLine(y.Value); // Uses Foo.Value 

当方法证明了这通常是清晰的 - 在这种情况下,即使你覆盖,你仍然与这两类有独立前场结束了,它只是其中的一个字段将是多余的。 没有覆盖,你有两个支持字段,你通过属性访问哪一个字段取决于你用来访问它的表达式的编译时类型。

+0

换句话说,我总是有2个后备字段,'new'只是同时使用两个字段。 – serhio 2010-02-24 15:39:01

1

这取决于你的目标。如果你正在创建一个“新”的方法,你实际上可以省去“新的”关键字,并只处理警告。为了清楚起见,“新”存在。另一方面,如果你的意图是重写继承的虚拟方法,那么省略“覆盖”实际上最终会创建一个“新”方法,而继承的方法不会被覆盖。

3

如果您忘记了override/new,Value的功能就如同您在其之前放置了new一样。

相关问题