2017-03-17 89 views
0

我有一個超類,有2個子類。如果條件foo是真正我想要的子類的一個採取一些行動,而其他子類都應該什麼都不做:有沒有解決方法在子類中清空方法?

public void doFoo() { 
    // some 10 lines common to both subclasses. 
    boolean foo = checkFoo(); 

    /** 
    * if foo is true, subclass1 should do something. subcass2 does nothing. 
    */ 

    // some 10 lines common to both subclasses. 
} 

我想出瞭解決辦法:

public void doFoo() { 
    // some 10 lines common to both subclasses. 
    boolean foo = checkFoo(); 

    if (foo) { 
     doSomething(); 
    } 

    // some 10 lines common to both subclasses. 
} 

class subclass1 extends superclass { 
    public void doSomething() { 
    // some lines of code. 
    } 

}

class subclass2 extends superclass { 
    public void doSomething() { 
    // do nothing 
    } 
} 

對這個常見問題有什麼更清潔,更好,更標準的解決方案?

+2

您是否需要派生類中的顯式空函數?您可以只在基礎中具有空函數,並且只在需要它的子類中覆蓋它 – UnholySheep

回答

6

你在描述什麼名字:它是Template Method pattern。現在設計模式並沒有像以前那樣被誇大了,但模板方法模式對於你描述的一般問題仍然是一種可靠和真實的方法。

如果您希望避免在子類中寫入空的doSomething()方法,那麼有一種方法可以在超類上使用空的doSomething()方法。這可以服務於多個子類(假設你有兩個以上的整體擔心),但個人而言,我傾向於對此稍微皺眉。重寫非抽象方法應該是罕見的(最好的)例外,而不是通常的做法。

3

這是「正確的」方法。但一些注意事項:

  • DoSomething的()可以是抽象的(如果要強制執行,每個子類必須提供一個具體的實現),另一方面
  • doFoo()應該是最終爲了防止子類從改變那種行爲。
相關問題