2017-02-13 53 views
0

我有一個類hirachy,如:Java的構造,使已經是正確的子類

class Main{ 
    Main(Object input){ /* */} 
} 

class SubA extends Main{ 
    SubA(Object input){ 
    super(input); 
    // ... 
    } 
} 

class SubB extends Main{ 
    SubB(Object input){ 
     super(input); 
     // ... 
    } 

} 

什麼我試圖impement是,的Main構造已經構造取決於在inputparameters一個子類。像這樣:

// Non working example 
class Main{ 
    Main(Object input){ 

    if (input.fullfillsSomeCond()) { return new SubA(input); } 
    if (input.fullfillsSomeOtherCond()) { return new SubB(input); } 

    } 
} 

這是非常不起作用的,因爲我會因爲遞歸而產生無限循環。有更好的建築巫婆允許 Main somthing = new Main(myInput);已經構建了正確的子類嗎?

+1

我認爲,根據超類中指定的條件,不允許超類生成子類類型。也許看工廠模式 - 它是一個衆所周知的模式,用於從一組可能性中創建特定的實現(包括子類):[工廠模式](https://en.wikipedia.org/wiki/Factory_method_pattern) –

+2

無法在構造函數中返回任何內容。看看[工廠模式](https://www.tutorialspoint.com/design_pattern/factory_pattern.htm)。含義:不要使用構造函數,而要使用工廠的方法。 – f1sh

+1

至少,你正試圖從構造函數返回一個值!這在java中是不可能的 –

回答

3

這是不可能的這種利用構造函數,但你可以使用一個工廠方法做:

class Main{ 
    Main(Object input){} 

    public static Main create(Object input) { 
     if (input.fullfillsSomeCond()) { return new SubA(input); } 
     if (input.fullfillsSomeOtherCond()) { return new SubB(input); } 
     // You might want to handle the case where input does not 
     // meet any of the above criteria. 
     throw new IllegalArgumentException("input must be either A or B!"); 
    } 
} 

用法:

// Instead of new Main(input): 
Main oMain = Main.create(myInput); 

隨着你可能想使Main抽象和其CTOR protected

這裏的缺點是Main必須「知道」它的子類和條件。但如果可以通過ctor完成的話,情況也是如此。

+1

這可能是最簡潔的方法來解決問題 – Gikkman

+0

好的。我將使用這種模式。謝謝。 – BerndGit