Effective C# Item29:只有當新版基類導致問題時才考慮使用new修飾符

    我們一般在類成員上使用new修飾符,來重新定義繼承自基類的非虛成員,但是我們不建議這麼做,因爲重新定義非虛方法會導致含混不清的行爲。

    非虛方法是靜態綁定的,編譯器並不會根據對象的運行時類型來判斷應該調用哪個方法;而虛函數使用的是動態綁定,編譯器會根據對象的運行時類型來判斷應該調用哪個方法。

    避免使用new 修飾符來重新定義非虛方法,並不是說你應該將基類中的所有方法都設計成虛方法。當程序庫的設計者將一個方法定義爲虛方法時,實際上是爲類型訂立了一個合約,表明任何派生類都可以更改虛方法的實現。實際上,虛方法集合定義了派生類中所有可能改變的行爲。“默認設置爲虛方法”的設計,表明派生類可以更改父類的所有行爲,這意味着我們沒有仔細考慮派生類到底會更改哪些部分的行爲,這樣做事不合適的。我們應該多花一些時間仔細考慮應該將哪些方法和屬性聲明爲多態成員。我們應該僅將這些成員聲明爲虛成員。不要認爲這種做法是對類的用戶的限制,相反,我們應該將這種做法當做是在定製類型行爲提供一些入口點。

    只有在一種情況下,我們需要使用new修飾符來重新定義虛方法:我們使用新版的基類後,發現基類中新添加的方法名和子列中已經存在的方法名有衝突。

    總結:我們在使用new修飾符時,應該非常小心,如果不分青紅皁白的使用,便會在對象上出現含混不清的方法調用。只有在“新版的基類添加的方法與子類中已存在的方法有衝突”的情況下,才考慮new修飾符。即使在這種情況下,我們也應該慎重考慮,除此之外,我們不應該再在任何其他情況下使用new修飾符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章