如果有条件扩大班级

时间:2018-07-18 08:41:03

标签: java android class android-activity

在Android应用中。我有一个HomeActivity(具有18000行代码)的要求,并且如果我的设备支持ARCore,我希望HomeActivity扩展为ARBaseACtivity,并且如果设备不支持不支持ARCore,那么我需要它来扩展NonARBaseActivity

我正在初始屏幕中检查这种情况。

现在,首先出现的一种方法是,我进行两个活动,与HomeActivity的副本相同,但是我需要知道有没有更好的方法可以做到这一点。因为我不想每次都复制,所以我对HomeActivity之一进行任何更改。

请支持者在下面发表评论,以便我可以改善我做错的地方。谢谢!!

2 个答案:

答案 0 :(得分:6)

技术答案是:不可能

在Java中,您的继承结构是固定的。根本不可能在一个上下文中让一个C类扩展A类,而在另一种上下文中使B类扩展。当您想要这样做时,最终将拥有两个类C1和C2。

当然,真正的答案是:您必须退后一步,明确地建筑师整个解决方案。单独 one 中的18K行表示存在严重错误。一个人可能会提到良好的古老FCoI原则,但是随后:18K行代码意味着很多代码和功能。根本不可能在一个关于stackoverflow的单一答案中为您提供适当的指导。

因此,自以为是:您应该退后一步,并确定要与之交谈的(架构)专家。然后与他们坐下(可能要花几个小时,甚至几天),然后看看您所拥有的以及您想去的地方。然后在那里的道路上一起工作。除了贴上症状外,别无其他。当然,如果不这样做,一切都不会破裂。但是前进的每一步只会在 mess 中添加 mess 。迟早要更改整体组件几乎是不可能的,每个人都将要求“将其丢弃并从头开始”。

答案 1 :(得分:2)

作为GhostCat出色答案的补充,我将向您提供OOP中的一个非常重要的提示:为了增强运行时的对象行为,装饰器模式通常是一种考虑方法。

此处HomeActivity作为装饰元素出现,而ARBaseACtivityNonARBaseActivity则作为装饰元素。
您应该定义一个MyActivity接口,它是装饰对象和装饰器对象的基类。

所以事情并不简单,因为您将不得不重构许多代码行,但是它将使您的设计更加灵活,并具有责任职责一致的类,而不是将上帝对象作为活动!

最后,您可以在启动屏幕中定义一个方法,该方法根据检测到的客户材料返回装饰HomeActivity的活动:

public MyActivity computeHomeActivity(){

    HomeActivity activity = new HomeActivity();

    if (isSupportARCore()){
       return new ARBaseACtivity(activity);
    }
    return new NonARBaseActivity(activity);

}