2014-10-06 66 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