在 Android 应用程序中。我有一个要求,我有我的
HomeActivity
(有18000行代码),如果我的设备支持ARCore
,我希望HomeActivity
与ARBaseACtivity
一起扩展,如果设备不支持ARCore
,那么我需要用 NonARBaseActivity
来扩展。
我正在启动屏幕中检查此情况。
现在,首先出现的一种方法是我制作两项活动,同样是
HomeActivity
的副本,但我需要知道是否有更好的方法可以做到这一点。因为我不想每次对其中一个 HomeActivity
进行任何更改时都进行复制。
技术答案是:不可能。
在Java中,继承结构是固定的。根本不可能让一个类 C 在一个上下文中扩展类 A,而在另一个上下文中扩展类 B。当您想要这样做时,您最终会得到两个类:C1 和 C2。
真正的答案当然是:您必须退后一步并清楚地架构师您的整个解决方案。仅 one 中的 18K 行就表明这里存在严重错误。人们可以提到古老的 FCoI 原则,但是:18K 行代码意味着大量的代码和功能。在 stackoverflow 上的单一答案中根本不可能给你提供正确的指导。
所以,固执己见:你应该退后一步,找到一些(架构)专家来交谈。然后和他们坐下来(可能几个小时,甚至几天),看看你已经得到了什么,以及你想要达到的目标。然后在那里的道路上一起努力。其他任何事情都只不过是在症状上贴创可贴而已。当然,如果你不这样做,什么都不会破坏。但每向前迈出一步,只会把“混乱”加到“混乱”上,让每一步都变得更加昂贵。迟早,改变你的庞然大物将变得几乎不可能,每个人都会要求“扔掉它,从头开始”。 作为对 GhostCat 优秀答案的补充,我将在 OOP 中给你一个非常重要的提示:为了增强
在运行时这里 HomeActivity
显示为要装饰的元素,而
ARBaseACtivity
和
NonARBaseActivity
显示为其装饰器。您应该定义一个
MyActivity
接口,它是装饰对象和装饰器对象的基类。
最后,在启动屏幕中,您可以定义一个方法,该方法根据检测到的客户端材料返回装饰
HomeActivity
的活动:
public MyActivity computeHomeActivity(){
HomeActivity activity = new HomeActivity();
if (isSupportARCore()){
return new ARBaseACtivity(activity);
}
return new NonARBaseActivity(activity);
}