下面的代碼應該給出警告嗎?爲什麼我的Static方法隱藏我的實例方法?
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public static void Do() { /*...*/ } /*...*/ }
它提供:
「警告CS0108: 'Bar.Do()' 隱藏了繼承的成員 'Foo.Do()' 使用new關鍵字隱藏,如果是打算。」
如果我進行了更改代碼:
class Foo { public static void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public void Do() { /*...*/ } /*...*/ }
我得到同樣的警告。
但是,如果我做了以下更改,警告消失。
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { new public static void Do() { /*...*/ } /*...*/ }
讓我做出進一步的變化:
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo {
new public static void Do()
{ new Bar().Do();/*...*/ } /*...*/
}
這並不編譯:
「錯誤CS0176:會員 'Bar.Do()' 不能用一個實例來訪問引用;改爲使用類型名稱對其進行限定。「
於是,我通過從一個靜態方法實例引用失去了我的繼承方法的訪問!
它背後的邏輯是什麼?或者我在某處犯了一個錯字?
我碰到這個來的時候,我試圖定義一個靜態方法「顯示」從「形式」得出自己的狀態。
當我說。 「新的酒吧()做();」。我肯定會調用實例方法「Do」,它可以在Bar via Foo中找到。那麼,爲什麼我們必須輸入演員? – isntn 2009-04-16 16:28:03
因爲編譯器不查看實例,而是查看類型元數據。在這裏它只找到一個具有正確簽名(名稱和空參數列表)的方法,這是靜態的。 – Lucero 2009-04-16 16:29:11
用虛擬功能表來考慮它; Bar :: Do()映射隱藏了Foo:Do()的映射。 – 2009-04-16 16:32:42