我有兩個類(我們稱它們爲A
和B
),它們都從一個共同的超類(C
)繼承。在運行時更改類的類型
比方說,我需要建立一個List
C
s。我的問題是,根據C
的構造函數收到的數據,我需要在列表中放入一個A
或B
對象。
有沒有辦法從C
的構造函數中做到這一點?或者,或者,我該如何解決這個問題?
我有兩個類(我們稱它們爲A
和B
),它們都從一個共同的超類(C
)繼承。在運行時更改類的類型
比方說,我需要建立一個List
C
s。我的問題是,根據C
的構造函數收到的數據,我需要在列表中放入一個A
或B
對象。
有沒有辦法從C
的構造函數中做到這一點?或者,或者,我該如何解決這個問題?
這聽起來像是一個使用factory pattern的好地方。基本上,創建一個具有返回類型爲C的靜態方法的CFactory類。然後,該方法可以決定創建A或B並返回該類。
爲什麼你需要從C的構造函數中完成它?移動任何邏輯確定哪個類型實例化到別的地方,並在那裏創建具體類型?
因爲C的構造函數接收到的數據會填充類成員 – 2010-08-05 14:34:41
@klez:你可以在'A'和'B'中創建一個構造函數,它使用'super(arg1,arg2等)'調用C的構造函數' – Powerlord 2010-08-05 14:38:45
@klez:然而,你是決定什麼數據進入C的構造函數的人。這不是一個答案。 – 2010-08-05 14:39:12
不可以。您不能從C的構造函數創建A或B對象。
您可以使用C中的靜態方法創建A或B,或者可以創建一些工廠類來完成此操作。
這被稱爲工廠模式。
工廠模式: 簡單地說,如果我們有一個超類和正子類,並根據提供的數據,我們不得不返回子類的一個對象,我們使用一個工廠模式。
你的執行將看起來像:
public class C {
//methods
}// End of class
public class A extends C {
//methods
}// End of class
public class B extends C {
//methods
}// End of class
public class CFactory {
public static void main(String args[]) {
CFactory factory = new CFactory();
factory.getObjects(args[0]);
}
public C getObjects(String type) {
if (type.equals("A"))
return new A();
else if(type.equals("B"))
return new B();
else
return null;
}
}// End of class
結帳這裏例如:
http://www.allapplabs.com/java_design_patterns/factory_pattern.htm
有沒有辦法從C的構造函數做到這一點。你可以創建一個在C工廠方法取決於數據,創建一個A或B收到:
class C {
public final static C newInstance(Object data) {
if (inspect(data)) {
return new A(data);
}
return new B(data);
}
}
一個抽象工廠方法應該可以幫助你哪個決定使用
public abstract class CFactory{
public abstract C createCObject(data...){
if (something) {
return new A();
}else{
return new B();
}
}
}
其中的C實現,那麼你可以通過使用抽象工廠方法建立列表...
希望這可以幫到...
這種氣味。你可能會遇到這個問題,因爲你的課堂設計不太好。通常,一個類不確定它本身是什麼類型。可能存在潛在的問題。 – Sjoerd 2010-08-05 14:25:53
@Sjoerd我從來沒有接受過正規的班級設計教育,所以你說的可能就是這樣。 – 2010-08-05 14:32:09