2013-01-21 82 views
1

我可以創建父類是動態的子類嗎?例如; class A extends B代碼,我可以根據條件更改B嗎?如果我可以從方法中返回它,那麼方法的返回類型是什麼?我的意思是class A extends getClassAccToCondition()返回類型。Java繼承;從可變類型延伸

+1

你看過java中的泛型? – Gleeb

+0

您不能在運行時動態定義超類,它們必須明確定義。你做這件事的原因是什麼?也許還有另一種選擇。 –

+0

這是關於這個問題; http://stackoverflow.com/questions/14399843/abstractregionpainter-java-7-dynamic-import – rdonuk

回答

0

我決定使用一種像工廠模式一樣的簡單多態性變體。它會爲我工作,我認爲。感謝您的回答。

public class Main { 
    public static I getClassBelongToCondition(boolean Condition) { 
     if (Condition) { 
      return new A(); 
     } else { 
      return new C(); 
     } 
    } 

} 

interface I { 
} 

class A extends B implements I { 
} 

class C extends D implements I { 
} 

class B { 
} 

class D { 
} 
0

不,您正在擴展的類必須明確說明。

2

由於其他答案已經說這是不可能的。

對於這種問題,您可以使用工廠模式。如果你有一個 類層次結構是這樣的:

class SuperType { ... } 
class SubType1 extends SuperType {...} 
class SubType2 extends SuperType {...} 

你可以有一個工廠這樣的:

class Factory { 
    public static SuperType create (Condition cond) { 
    if(cond.matchForType1()) 
     return new SubType1(); 
    else 
     return new SubType2(); 
    } 
} 

可以比通過Factory.create(<condition that match for the required type>)調用此方法。

如果您搜索「工廠模式」+「java」,您會發現很多 更好的示例。

+0

但在我的情況下,'超級類型'是可變的。創建方法的返回類型是什麼? – rdonuk

+0

SubType1和SubType2是SuperType的不同實現。返回的類型是'SuperType',所以根據你的條件你將得到相應的實現。 – Michael

0

從技術上說,它不可能在java中實現這一點。但是,我想嘗試使用多態性和某種工廠方法模式來解決實際業務問題。不確定,如果這對你有幫助,但在java中不能實現不同的父項。

0

您不能在編譯時定義一個不是靜態類型的類。 但是,您可以在運行時生成類,請看javassist。這就是說,代碼生成不是唯一的選擇。如果您不需要動態超類,但只需要接口,則可以使用dynamic proxies