2014-09-30 84 views
0

我確信之前會詢問這個問題,但在搜索一段時間後我找不到它。以抽象類作爲參數的Java方法返回子類的實例

我需要一個函數,將做類似如下:

public static AbstractClass createClass(Class<AbstractClass> theChildClass, int someVariable){ 
    AbstractClass theInstance = theChildClass.newInstance(someVariable); 
    return theInstance; 
} 

然後在抽象類我想定義它像這樣:

public abstract class AbstractClass{ 

    private int someVariable; 

    public AbstractClass(int someVariable){ 
     this.someVariable = someVariable; 
     initOnChild(); 
    } 

    protected abstract void initOnChild(); 

} 

然後在子類我最好不要」 t想要定義「public ChildClass(int someVariable){}」方法,因此它們看起來像這樣:

public class ChildClass extends AbstractClass{ 

    @Override 
    protected void initOnChild(){ 
     //do some stuff 
    } 

} 

我後來的理想結果是能夠調用如下方法:

ChildClass theInstance = UtilityClass.createClass(ChildClass.class, 1); 

這甚至有可能嗎?任何解決方案或建議非常讚賞。

回答

0

沒有,但有一個解決方案。

先用在構造函數中調用一個覆蓋方法的問題:

當然
abstract class A { 

    A() { 
     init(); 
    } 

    protected abstract void init(); 
} 

class B extends A { 

    public String x = null; 
    public String y; 

    @Override 
    protected void init() { 
     x = "x"; 
     y = "y"; 
    } 
} 

public static void main(String[] args) { 
    B b = new B(); 
    System.out.printf("x=%s, y=%s%n", b.x, b.y); 
} 

會給:

x=null, y=y 
  • 在B() - 所有字段歸零
  • 超( )A()
  • in A()B.init()called
  • in B()字段初始化已完成

但是,從表面上看並不明顯,並且在使用基類中的字段時,可能會變得不那麼明顯。

現在的解決方案。

由於您有一個靜態工廠方法,因此可能將此方法放在AbstractClass中。然後它可以在施工後調用init。

public static <T extends AbstractClass> T create(Class<T> childClass, int param) { 
    T instance = childClass.getConstructor().newInstance(); 
    instance.init(param); 
    return instance; 
} 

這將執行默認的構造函數。

如果這仍然不能令人滿意,那麼可能只是某些數據結構不在正確的繼承級別,或者應該重新構造。

+0

我沒有'標記爲有用'的聲望,但這正是我所追求的!謝謝。 – AndyW 2014-09-30 14:03:03

1

編號構造函數不是繼承的(因此不是JLS中的成員)。比如,你可能想要應用這種策略模式。

(ObNote:通常它被認爲是一個壞主意,調用構造函數從方法覆寫投放和反射幾乎總是一個非常糟糕的主意。)

+0

策略模式? – AndyW 2014-09-30 13:01:16

+0

@ user3210941策略模式,您將變量行爲對象從公共狀態中分離出來。作爲被過時的「四人幫」書籍推廣的模式。 http://www.amazon.co。uk/Design-patterns-elements-reusable-object-oriented/dp/0201633612 – 2014-09-30 13:05:55

相關問題