2014-10-06 67 views
1

我在Android應用程序的工作,我得到了這樣的情況:實施某種「靜態抽象繼承」方法

-GenericOrderDetailFragment,擴展片段的抽象類。

- 這個類的三個非抽象「兒子」:LinesFragment,HeaderFragment,NoteFragment。

在三個兒子中有很多方法是相同的,所以我在抽象類上聲明,這就是它存在的原因。

我被一個特別卡住了。到現在爲止,我把這個方法兒子裏面,它的偉大工程:

public class LinesFragment extends GenericOrderDetailFragment { 

    [...] 

    public static LinesFragment newInstance(Order o) { 
     LinesFragment fragment = new LinesFragment(); 
     putSerializable(o, fragment); 
     return fragment; 
    } 

    [...] 

} 

這種方法是在所有的兒子一樣,除了返回類型:LinesFragment應該返回LinesFragment例如,HeaderFragment應該返回HeaderFragment istance ......我想把這個作爲父類一mustoverride,但我不能這樣做,因爲:

只要把

public static GenericOrderDetailFragment newInstance(Order o) { 
    GenericOrderDetailFragment fragment = new GenericOrderDetailFragment(); 
    putSerializable(o, fragment); 
    return fragment; 
} 

方法不起作用,只是因爲我不能istantiate一個GenericOrderDetailFragment(這是絕對的道)。我不能istantiate一個 .getClass()項,「原因沒有:該方法是靜態的!我不能聲明一個「靜態抽象」方法(在Java中,靜態爲「不可重複」,抽象爲「mustoverride」,因此它們不能共存),所以我不能強制擴展GenericOrderDetailFragment的用戶重寫該方法。

如果我擴展這個泛型類,有一些方法我必須重寫,所以我不能聲明不抽象的父類。

是否可以使用任何解決方法?提前致謝!

回答

3

您可以使用反射此:

public static <T extends GenericOrderDetailFragment> T newInstance(Class<T> cl, Order o) { 
    Constructor<T> c = cl.getConstructor(); 
    T fragment = c.newInstance(); 
    ... 
} 

請注意,我離開了任何Exception。所以你必須自己做異常處理。

但基本上這應該是你正在尋找的。

+0

哇,這個作品近乎完美,非常感謝!只有一點點注意:我必須_pass_類才能使它工作[OrderDetailNotesFragment.newInstance(_OrderDetailNotesFragment.class_,toSaveOrder); ]。有沒有更緊湊的方式來寫它? newIstance是靜態的,所以我不能簡單地通過自動方式_this_類,因爲沒有任何_this_!無論如何,謝謝! – 2014-10-06 13:43:55

+0

@SimoneChelo不,我不知道在方法調用中省略類。你也必須告訴方法創建哪個類... – 2014-10-06 13:45:57

+0

好吧,它也適用於這種方式!再次感謝! – 2014-10-06 13:46:48

1

如果您希望用戶覆蓋newInstance(Order o),則可以在GenericOrderDetailFragmentnewInstance(Order o)中投擲Exception。這樣,你強制用戶覆蓋它。

+0

這是一個很好的解決方法,如果我想_mustoverride_ _static_方法,我會使用它!謝謝! – 2014-10-06 13:45:45