2010-08-01 67 views
3

我有一堆擴展抽象基類的類。 每個子類都像構造函數中一樣使用數組(根據類的不同長度)。 這些類可以由其他人編寫。查找關於java中的類,軟件設計的信息?

找出班級需要的數組長度的最佳方法是什麼? 我可以: (A)要求每個派生類都有一個靜態方法,返回長度。 但是,基類無法執行此操作,因爲抽象靜態方法在java中不起作用。 (B)每個派生類都有一個沒有參數的構造函數,並且我構造了這樣的類,只是爲了能夠調用countParameters()方法,即可以從基類中強制執行和。這感覺是「狡猾」,因爲我不想創建這樣的對象,但只需要一些關於它的信息。

原因是我正在創建一個GUI,它使用戶能夠創建Derived類的 實例,但每個Derived類都有不同數量的參數。 也就是說,我需要知道如何在創建類之前繪製GUI。

編輯: 我可以只是要求每個派生類有一個私人的 構造函數,沒有參數,並使用反射我可以調用countParameters()方法。

編輯2:其實,我感興趣的是參數的名稱。 也就是說,如果派生的類具有構造

public Derived(double name1,double name2,...) 

我需要一種方法來生成String []數組

{name1,name2,...} 

我想這是不可能做到的,而無需創建的一個實例類, 但用戶能夠創建這樣的類,他/她需要參數名稱! 時刻22.

+1

爲什麼要反射?如果方法被保護,你可以在你的基類中聲明它。 – meriton 2010-08-01 11:41:52

+0

正如@soru所說*工廠模式*聽起來對這種事情是正確的。想想看,你根據情況(即參數的數量)實例化了孩子班級。看起來你已經爲此做了一些代碼。這不是另一個類。 – FK82 2010-08-01 12:25:03

+0

這不是JDK中的PropertyEditor Stuff的全部內容嗎? – ZeissS 2010-08-01 12:50:11

回答

0

你不是很清楚你想達到什麼,但我想知道:子類是否真的必須帶一個數組的參數,而不是一個參數列表?

Constructor<?> ctor = Test.class.getConstructors()[0]; 
int parameterCount = ctor.getParameterTypes().length; 
ctor.newInstance(new Object[parameterCount]); 
+0

該方法可能更好,這樣,我可以 檢查類,並找到沒有實際創建它的參數數量。 – 2010-08-01 12:27:28

+0

哦,但它並沒有真正解決我的問題,但請參閱我的第二個編輯。 – 2010-08-01 12:46:02

+0

這可能是我能得到的最接近的; 我沒有辦法在沒有創建任何課程的情況下找到更多信息。 – 2010-08-01 17:49:32

5

這聽起來像你需要Factory Pattern

一般來說,基類知道它的後代的集合是一個壞主意。所以你定義了另一個知道這個職業的人。

如果您有類似Shape的東西,將ThisShape和ThatShape作爲派生類,那麼ShapeCreator將處理創建程序支持的特定形狀集的工作,併爲每個形狀提供所需的參數。

0
how about this code: 

public absract Base { 

    public abstract int size(); 

    public Base(Object[] objs) { 
     if (objs.length != size()) { 
     throw new IllegalArgumentException(); 
     } 
    //rest of your code. 
} 

每個子類都需要實現size方法。

希望對您有所幫助。

0

我會用方法A去的。你不能讓編譯器強制執行這種方法,但你可以在你的程序中執行它 - 沒有方法,沒有工作!

說真的,這整個計劃有點脆弱,我想不出一個辦法讓它變得更好。這些子類的不正確實施將被炸燬,這就是生活。

一個可能的補救措施將是你爲這些子類提供了一組接口,如

SubClassTaking2Args 
SubClassTaking3Args 
... 

,並要求你子的實施這些作爲一個標記接口之一。但這只是更多的官僚作風,效果不大。