2010-08-05 117 views
2

我有兩個類(我們稱它們爲AB),它們都從一個共同的超類(C)繼承。在運行時更改類的類型

比方說,我需要建立一個ListC s。我的問題是,根據C的構造函數收到的數據,我需要在列表中放入一個AB對象。

有沒有辦法從C的構造函數中做到這一點?或者,或者,我該如何解決這個問題?

+0

這種氣味。你可能會遇到這個問題,因爲你的課堂設計不太好。通常,一個類不確定它本身是什麼類型。可能存在潛在的問題。 – Sjoerd 2010-08-05 14:25:53

+0

@Sjoerd我從來沒有接受過正規的班級設計教育,所以你說的可能就是這樣。 – 2010-08-05 14:32:09

回答

7

這聽起來像是一個使用factory pattern的好地方。基本上,創建一個具有返回類型爲C的靜態方法的CFactory類。然後,該方法可以決定創建A或B並返回該類。

1

爲什麼你需要從C的構造函數中完成它?移動任何邏輯確定哪個類型實例化到別的地方,並在那裏創建具體類型?

+0

因爲C的構造函數接收到的數據會填充類成員 – 2010-08-05 14:34:41

+0

@klez:你可以在'A'和'B'中創建一個構造函數,它使用'super(arg1,arg2等)'調用C的構造函數' – Powerlord 2010-08-05 14:38:45

+0

@klez:然而,你是決定什麼數據進入C的構造函數的人。這不是一個答案。 – 2010-08-05 14:39:12

0

不可以。您不能從C的構造函數創建A或B對象。

您可以使用C中的靜態方法創建A或B,或者可以創建一些工廠類來完成此操作。

3

這被稱爲工廠模式。

工廠模式: 簡單地說,如果我們有一個超類和正子類,並根據提供的數據,我們不得不返回子類的一個對象,我們使用一個工廠模式。

你的執行將看起來像:

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

3

有沒有辦法從C的構造函數做到這一點。你可以創建一個在C工廠方法取決於數據,創建一個A或B收到:

class C { 
    public final static C newInstance(Object data) { 
     if (inspect(data)) { 
      return new A(data); 
     } 
     return new B(data); 
    } 
} 
1

一個抽象工廠方法應該可以幫助你哪個決定使用

public abstract class CFactory{ 
    public abstract C createCObject(data...){ 
     if (something) { 
      return new A(); 
     }else{ 
      return new B(); 
     } 
    } 
} 

其中的C實現,那麼你可以通過使用抽象工廠方法建立列表...

希望這可以幫到...