1 回答

TA貢獻1810條經(jīng)驗 獲得超4個贊
知道這條消息真正告訴我什么嗎?
首先,了解隱藏的含義。暫時忘記這是一個事件的事實。如果我們有:
class B { public void M() { Console.WriteLine("B.M()"); } }
class D : B { public void M() { Console.WriteLine("D.M()"); } }
那么我們有兩個方法都稱為 M。如果你說:
D d = new D();
B b = d;
d.M(); // D.M();
b.M(); // B.M();
編譯器警告你有兩種方法,而不是一種,你得到哪一種取決于接收器的編譯時類型,而不是接收器的運行時類型。
為什么這可能不是你想要的?
三個原因。
首先,許多 C# 程序員是從 Java 轉(zhuǎn)到 C# 的,Java 中的方法會自動重寫。在 C# 中,方法必須virtual被覆蓋。編譯器告訴你,你沒有得到你可能期望的語義。
其次,這是為了緩解脆弱的基類問題。假設(shè) B 的作者給 D 團隊一個 DLL 程序集,其中包含 B 而沒有 M,D 從中派生,添加方法 DM 那么 B 團隊意識到他們可以實現(xiàn) M,所以他們將它添加到 B 并給 D 團隊一個新的部件?,F(xiàn)在應(yīng)該警告 D 團隊 BM 存在,以便他們可以決定是否刪除 DM。
第三,你為什么要這樣做?如果基類已經(jīng)有你想要的事件,就使用它吧!不要用舊的做新的;只用舊的。編譯器告訴你,你肯定在做一些奇怪而且可能是錯誤的事情。
如果您打算讓兩個成員位于兩個不同的類中,其中一個隱藏另一個,您可以通過放置new成員告訴編譯器“我已經(jīng)考慮過這個,這是故意的”。那就是“這是一個新成員,我的意思是讓它成為一個新成員,而不是覆蓋舊成員”。
- 1 回答
- 0 關(guān)注
- 111 瀏覽
添加回答
舉報