在Android应用中。我有一个HomeActivity
(具有18000行代码)的要求,并且如果我的设备支持ARCore
,我希望HomeActivity
扩展为ARBaseACtivity
,并且如果设备不支持不支持ARCore
,那么我需要它来扩展NonARBaseActivity
。
我正在初始屏幕中检查这种情况。
现在,首先出现的一种方法是,我进行两个活动,与HomeActivity
的副本相同,但是我需要知道有没有更好的方法可以做到这一点。因为我不想每次都复制,所以我对HomeActivity
之一进行任何更改。
请支持者在下面发表评论,以便我可以改善我做错的地方。谢谢!!
答案 0 :(得分:6)
技术答案是:不可能。
在Java中,您的继承结构是固定的。根本不可能在一个上下文中让一个C类扩展A类,而在另一种上下文中使B类扩展。当您想要这样做时,最终将拥有两个类C1和C2。
当然,真正的答案是:您必须退后一步,明确地建筑师整个解决方案。单独 one 中的18K行表示存在严重错误。一个人可能会提到良好的古老FCoI原则,但是随后:18K行代码意味着很多代码和功能。根本不可能在一个关于stackoverflow的单一答案中为您提供适当的指导。
因此,自以为是:您应该退后一步,并确定要与之交谈的(架构)专家。然后与他们坐下(可能要花几个小时,甚至几天),然后看看您所拥有的以及您想去的地方。然后在那里的道路上一起工作。除了贴上症状外,别无其他。当然,如果不这样做,一切都不会破裂。但是前进的每一步只会在 mess 中添加 mess 。迟早要更改整体组件几乎是不可能的,每个人都将要求“将其丢弃并从头开始”。
答案 1 :(得分:2)
作为GhostCat出色答案的补充,我将向您提供OOP中的一个非常重要的提示:为了增强运行时的对象行为,装饰器模式通常是一种考虑方法。
此处HomeActivity
作为装饰元素出现,而ARBaseACtivity
和NonARBaseActivity
则作为装饰元素。
您应该定义一个MyActivity
接口,它是装饰对象和装饰器对象的基类。
所以事情并不简单,因为您将不得不重构许多代码行,但是它将使您的设计更加灵活,并具有责任职责一致的类,而不是将上帝对象作为活动!
最后,您可以在启动屏幕中定义一个方法,该方法根据检测到的客户材料返回装饰HomeActivity
的活动:
public MyActivity computeHomeActivity(){
HomeActivity activity = new HomeActivity();
if (isSupportARCore()){
return new ARBaseACtivity(activity);
}
return new NonARBaseActivity(activity);
}