扩展类的If条件

问题描述 投票:0回答:2

在 Android 应用程序中。我有一个要求,我有我的

HomeActivity
(有18000行代码),如果我的设备支持
ARCore
,我希望
HomeActivity
ARBaseACtivity
一起扩展,如果设备不支持
ARCore
,那么我需要用
NonARBaseActivity
来扩展。

我正在启动屏幕中检查此情况。

现在,首先出现的一种方法是我制作两项活动,同样是

HomeActivity
的副本,但我需要知道是否有更好的方法可以做到这一点。因为我不想每次对其中一个
HomeActivity
进行任何更改时都进行复制。

java android class android-activity
2个回答
6
投票

技术答案是:不可能

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

真正的答案当然是:您必须退后一步并清楚地架构师您的整个解决方案。仅 one 中的 18K 行就表明这里存在严重错误。人们可以提到古老的 FCoI 原则,但是:18K 行代码意味着大量的代码和功能。在 stackoverflow 上的单一答案中根本不可能给你提供正确的指导。

所以,固执己见:你应该退后一步,找到一些(架构)专家来交谈。然后和他们坐下来(可能几个小时,甚至几天),看看你已经得到了什么,以及你想要达到的目标。然后在那里的道路上一起努力。其他任何事情都只不过是在症状上贴创可贴而已。当然,如果你不这样做,什么都不会破坏。但每向前迈出一步,只会把“混乱”加到“混乱”上,让每一步都变得更加昂贵。迟早,改变你的庞然大物将变得几乎不可能,每个人都会要求“扔掉它,从头开始”。 作为对 GhostCat 优秀答案的补充,我将在 OOP 中给你一个非常重要的提示:为了增强

在运行时

2
投票

这里 HomeActivity 显示为要装饰的元素,而

ARBaseACtivity

NonARBaseActivity
显示为其装饰器。
您应该定义一个 
MyActivity
 接口,它是装饰对象和装饰器对象的基类。 

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

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

HomeActivity

的活动:

public MyActivity computeHomeActivity(){ HomeActivity activity = new HomeActivity(); if (isSupportARCore()){ return new ARBaseACtivity(activity); } return new NonARBaseActivity(activity); }

    

© www.soinside.com 2019 - 2024. All rights reserved.