2011-11-21 73 views
4

我注意到,當使用Visual Studio重寫C#中的虛擬方法時,IDE會自動添加base.Method()調用。另一方面,當重寫抽象方法時,IDE會自動添加一個NotImplementedException()。重寫虛擬方法時,調用基本方法是否是最佳實踐?

爲什麼VS在覆蓋虛擬方法時自動添加base.Method()調用?調用基本方法是否是最佳實踐?

回答

7

這取決於您是否仍需要發生基本行爲。這個決定將在個案基礎上作出。沒有硬性規定,儘管某些模式會期望調用基本方法(正確執行IDisposable pattern這種方式)

-3

添加像這樣的調用它不會修改方法行爲。

0

如果您完全覆蓋相關方法,則可能會認爲您有更高的風險遵循Liskov替代原則。但是沒有一個通用的規則可以遵循。

0

抽象方法基本上是一個空方法。 IDE添加未實現的異常來通知該方法尚未實現,並且它不能委派給基類,因爲即使在那裏它也沒有實現。 在虛擬方法的情況下,IDE默認會調用該方法的基類實現,因爲它至少會在那裏實現(您可能會覆蓋)

4

Visual Studio自動生成基類調用。您可以選擇是否適合撥打基地,這取決於您的重覆原因。

0

這完全取決於你需要做什麼。通常你需要在「child」方法中包含「base」方法行爲,這就是爲什麼VS有助於添加語法的原因。但是,在所有情況下都不一定如此。另一方面,實現抽象方法意味着沒有可以調用的「基礎」方法(畢竟,它是抽象的!),所以最好的VS能做的只是將方法「標記」爲未實現。

0

考慮在您使用TE VS的代碼生成器的情況下,但後來忘記(或決定不)填寫方法體英寸

如果要覆蓋一個virtual方法,如果你不想以任何方式改變行爲,合理的做法是保留舊的 - 這就是base調用的功能。

另一方面,儘管如此,當您使用overrideabstract方法時,您沒有任何base來引用 - 抽象方法根據定義沒有body。 因此,如果您在重寫中未能提供新的實現,它總是出錯。 NotImplemented異常引起您的注意。

有些模式需要您調用方法(例如IDisposable或某些模板方法的情況)。在其他情況下,總是需要提供新的實施方式,因此取決於方案。

0

調用基方法取決於你想要做什麼:

例如,如果重寫的OnInit控制,事件「初始化」默認情況下不提高,如果你不調用基方法的方法。如果你想完全改變方法的行爲,你不應該調用base方法。例如,重寫方法ToString()的StringBuilder類有他自己的實現,並且永遠不會調用基類(對象)的ToString

我認爲Visual Studio建議基地調用,因爲沒有其他修改,所有仍然工作(基礎bheaviuor沒有改變) 必須實現抽象方法,並拋出異常,因爲默認語句應該幫助您重新正確執行

相關問題