閱讀515 返回首頁    go 支付寶


C++編程規範之39:考慮將虛擬函數生命為非公用的,將公用函數聲明為非虛擬的

摘要:

    在基類中進行修改代碼高昂:請將公用函數設為非虛擬的。應該將虛擬函數設為私有的,或者如果派生類需要調用基類版本,則設為保護的。

    在麵向對象層次結構中進行修改是昂貴的,所以應該實施完整的抽象:將公用函數設為非虛擬的,將虛擬函數設為私有的。這就是所謂的非虛擬接口模式。

    公用虛擬函數本質上有兩種不同而且互相競爭的職責,針對的是兩種不同而且互相競爭的目標:

    1.它製定了接口。作為公用函數,它是類向外界提供的接口的一部分。

    2.它製定了實現細節。作為虛擬函數,它為派生類替換函數的基類實現提供了一個鉤子,它是一個自定義點。

    因為這兩種職責的動機和目標都不同,所以它們可能會發生衝突,因而從定義上來講一個函數無法很好地履行兩種職責。公用虛擬函數本身有兩種on革命性不同的職責和兩種互相競爭的目標,這是沒有很好地將問題關注點分離的標誌。

    通過將公用函數與虛擬函數分離,可以獲得如下明顯的好處。

    1.每個接口都能自然成形。將公用函數與自定義接口分離後,每個接口都能很容易地獲得符合其自然需求的形式,而不用尋找折中方案,以使他們看上去相同。兩個接口經常需要不同數量的函數或不同的參數。

    2.基類擁有控製權。基類現在完全控製著其接口和策略,可以實時接口的前後置條件、插入度良性代碼,還可以在一個方便的可重用場所中做任何類似的工作。因此,這種為了分離而進行的“預構“能夠促進良好的類設計。

    3.基類能夠健壯地適應變化。以後,我們可以隨意改變構思、添加前後條件檢查,或者將處理工作分成更多步驟,或者進行重構,或者用Pimpl慣用法實現更完整的接口與實現的分離,或者對基類的可自定義性進行其他修改,而不會影響到使用此類或者從此類繼承的任何代碼。

最後更新:2017-04-03 12:54:03

  上一篇:go Storm可靠性及事務性相關設計: Acker及Trident State
  下一篇:go 對Android近期任務列表(Recent Applications)的簡單分析