我遇到了一種情況,我要擴展給定類的功能,但我不確定最好的解決方法。我開始通過調用功能「向上」,現在已經切換到「向下」,但我發現兩者都有問題。讓我解釋我的意思。首先,「向上」的方法:什麼是擴展功能的最佳途徑?
public class ParentValidator
{
public void validate() {
// Some code
}
}
public class ChildValidator extends ParentValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
此功能完美很好,但它要求我永遠記得的地方super.validate()在我的方法體或在父類(ES)的邏輯贏得」被執行。另外,由於子類可以實際替換/修改父類中定義的代碼,所以這種方式的擴展可以被認爲是「不安全的」。這就是我稱之爲「向上」的方法,因爲我正在調用更高級別的方法。
爲了應對這些不足,我決定製作ParentValidator.validate()final並讓它調用一個不同的方法。下面是我的代碼修改爲:
public class ParentValidator
{
public final void validate() {
// Some code
subValidate();
}
protected void subValidate() {}
}
public class ChildValidator extends ParentValidator
{
@Override
public final void subValidate() {
// Some code
subSubValidate();
}
protected void subSubValidate() {}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void subSubBalidate() {
// Some code
subSubSubValidate();
}
protected void subSubSubValidate();
}
這就是我指的是,當我說我打電話向下爲每個類調用類上「向下」的繼承鏈的方法。
使用這種方法,我可以保證父類中的邏輯將被執行,我喜歡。但是,它不能很好地擴展。我擁有的繼承層越多,它所得到的醜陋。在一個層面上,我認爲這是非常優雅的。在兩個層面上,它開始看起來以次充好。在三個或更多,這是可怕的。另外,就像我必須記住調用super.validate()作爲我的任何孩子的驗證方法的第一行一樣,現在我必須記住在任何一個的子節點的末尾調用一些「subValidate」方法我的父母的驗證方法,所以似乎沒有得到任何改善。
有沒有更好的方法來做這種類型的擴展,我甚至沒有涉及到。這些方法都有一些嚴重的缺陷,我想知道是否有更好的設計模式可以使用。
這種方法的唯一限制是您必須對被訪問的對象進行回調。如果物體「閉合」,那麼你必須解決反射(醜陋)。 – 2011-04-29 15:15:24