2012-04-18 56 views
3

我見過很多框架和幫助程序類,它們要求您在繼承的類覆蓋MethodName()中調用它們的base.MethodName()。但是,其中一些要求它是重寫方法中的最後一次呼叫,而其他呼叫則是第一次呼叫。它應該被調用的方式並不總是很明顯,通常只能通過閱讀文檔或樣本才能得出結論。覆蓋基地呼叫訂單約定?

那麼,我的結論是否正確:在哪裏沒有該領域的一些最佳實踐,並且調用方法base在overriden方法中的位置取決於框架設計器是否只有?或者有,我應該更喜歡一些設計而不是另一種?就我個人而言,我發現調用基礎更加自然,就像在構造函數中一樣(這個設計被強制執行)。或者有些情況(或區域)迫使開發者使用特定的呼叫訂單?

UPDATE。在@Attila的幫助下,我現在可以看到,大多數base類調​​用都可以重新設計。取而代之的是:

// FRAMEWORK 
public virtual void SomeMethod() 
{ 
    // framework code 
} 

// USAGE 
public override void SomeMethod() 
{ 
    base.SomeMethod(); 

    // user code 
} 

這樣做:

// FRAMEWORK 
public void SomeMethod() 
{ 
    // framework code 

    // you can place UserSomeMethod where you want, 
    // you can change it position in new versions of a fremework 
    // without breaking user code 
    this.SomeMethodUserCode(); 
} 

protected abstract void SomeMethodUserCode(); 

// USAGE 
protected override void SomeMethodUserCode() 
{ 
    // user code 
} 

用戶失去一些靈活性(可以理解爲「有較少的選項打破,或讓你的框架的工作錯」),但使用很簡單。

回答

4

您需要調用基本方法的確切位置和順序完全取決於基類的邏輯(它是如何設計的)。因此,沒有「單向」總是正確的。您將不得不繼續閱讀規格和文檔

也許更好的設計是不需要任何回調基地:基地執行它認爲合適的方法,並允許派生類通過抽象方法提供自定義功能,需要時調用基地電話;從而減輕客戶必須知道呼叫的確切順序。

+0

同意最好不要打電話給基地。所需的覆蓋應該是抽象的恕我直言。那麼我們可以打電話給任何一個需要'base.'的框架調用一個糟糕的設計嗎?解決了這個問題! :-) – 2012-04-18 04:00:44

+0

我認爲這取決於具體情況:如果存在特定的服務順序,但部分計算可以定製,調用抽象方法的基礎是最好的方法;如果無法用一種特定的方式來描述計算,派生的調用庫執行常見但固定的計算是更好的方法。 – Attila 2012-04-18 04:06:31