2011-12-14 152 views
4

我有一個正常的類叫做BaseView虛擬方法DisplayView。該方法調用GetHeaderGetBody虛擬方法來獲取頁面的內容。然後我會創建一個繼承自BaseView的類,並重寫需要顯示內容的方法,而不是基類的方式。C#繼承最佳做法

我的問題是,雖然這很好,但在運行代碼分析時,我被警告不要直接調用虛函數。

我應該在覆蓋虛函數的基類上創建另一個類圖層,並且只能從那裏繼承嗎?

直接使用虛擬方法有什麼缺點?

編輯:警告是:

CA2214:Microsoft.Usage:XXX包含導致 呼叫到由類定義的虛擬方法的調用鏈。審查意想不到的後果

+7

請顯示確切的警告消息 – 2011-12-14 11:07:19

+1

在派生類方法實現中添加新的/覆蓋關鍵字,可能會發出此警告。 – Maheep 2011-12-14 11:08:16

回答

4

以下 調用堆棧我認爲這個問題是DisplayView是虛擬的,它的調用虛擬方法。在大多數情況下,虛擬方法被最終方法調用,作爲改變行爲的手段,例如在戰略模式中。如果最後一個方法調用一個虛擬方法,那麼編譯器知道在所有派生類中將始終調用該虛擬方法,因此它對於虛擬方法的存在是有效的。如果是虛擬的,則另一個實現可能會覆蓋它。當前實現調用虛擬GetHeader,但派生類可能不會。因此它不能保證GetHeader不是死碼。

這可能是FxCop提請注意的。它想知道如果你在一個基類中定義了一個虛擬方法(在這種情況下爲GetHeader),所有派生實現都將使用它。

我會專注於做最後的決定DisplayView,或者從這個角度評估你的設計。