2010-02-24 27 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一樣。

相關問題