2014-01-23 37 views
1

我想在Java中創建一個抽象類,其創建的一部分涉及調用子類需要實現的初始化方法。我希望子類可以訪問任意參數,但是,抽象類不需要知道。是否有強制初始化子類實現方法的設計模式?

下面是一些代碼,使之更加明確:

public abstract class NormalizedRandom<T> { 

    private Queue<T> randomList; 
    private List<T> usedRandomsList; 

    public NormalizedRandom() { 
     randomList = new LinkedList<T>(); 
     usedRandomsList = new ArrayList<T>(); 
     init(); 
     shuffleList(); 
    } 

    protected abstract void init(); 

    ... 

} 

而且

public class NormalizedRandomIntegerRange extends NormalizedRandom<Integer> { 

    private int min; 
    private int max; 
    private int repeats; 

    public NormalizedRandomIntegerRange(int min, int max, int repeats) { 
     this.min = min; 
     this.max = max; 
     this.repeats = repeats; 
    } 

    @Override 
    protected void init() { 
     for(int num = min; num <= max; num++) { 
      for(int i = 0; i < repeats; i++) { 
       super.addRandomOutcome(num); 
      } 
     } 
    } 
} 

顯然,這是行不通的,因爲超()需要被調用之前,我可以初始化參數。

這類問題看起來像必須有一些簡單的設計模式來解決它。我想不出正確的方法來解決它。

回答

1

嘗試將初始化部署到自己的類或接口中,該子類必須提供超類作爲構造函數的參數。 現在,您可以輕鬆切換並重新初始化init方法,並且在子類代碼運行之前,超類可以自行調用它。 initStrategy可以使用參數初始化,這些參數是超類的 。我會使用一個接口。 (我想你已經知道了,但它是一種策略模式)。

希望這有助於史蒂夫。

+0

這正是我想要的解決方案。在給了它更多的思考之後,我實際上意識到我正在過度構建這個問題。層次結構實際上並不需要那麼靈活:我實際上只會在子類構造函數中發生初始化,並且如果稍後再創建更多的子類,就需要記住這樣做。 – Chill

0

我認爲你可以使用'生成器',它是用來避免有許多不同構造函數的創建模式。 我的意思是從構造器中獲取對象的初始化。使用一個Builder類來達到這個目的。

+0

生成器無法正常工作,因爲它爲問題增加了一個間接層。我希望子類能夠直接定義它的初始化,這就是JacksOnF1建議的策略模式所能做到的。 – Chill

相關問題