我見過很多框架和幫助程序類,它們要求您在繼承的類覆蓋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
}
用戶失去一些靈活性(可以理解爲「有較少的選項打破,或讓你的框架的工作錯」),但使用很簡單。
同意最好不要打電話給基地。所需的覆蓋應該是抽象的恕我直言。那麼我們可以打電話給任何一個需要'base.'的框架調用一個糟糕的設計嗎?解決了這個問題! :-) – 2012-04-18 04:00:44
我認爲這取決於具體情況:如果存在特定的服務順序,但部分計算可以定製,調用抽象方法的基礎是最好的方法;如果無法用一種特定的方式來描述計算,派生的調用庫執行常見但固定的計算是更好的方法。 – Attila 2012-04-18 04:06:31