Java 扩展类时的If条件

Java 扩展类时的If条件,java,android,class,android-activity,Java,Android,Class,Android Activity,在Android应用程序中。我有一个要求,我有我的HomeActivity(有18000行代码),如果我的设备支持ARCore,我希望HomeActivity扩展为ARBaseACtivity,如果设备不支持ARCore,那么我需要它扩展为非ARBaseACtivity 我正在启动屏幕中检查此情况 现在,有一种方法,首先是我做两个活动,一个相同的HomeActivity,但我需要知道有没有更好的方法来做。因为我不想每次在家庭活动中做任何更改时都进行复制 请在下面发表评论,以便我能改进我的错误。谢

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

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

现在,有一种方法,首先是我做两个活动,一个相同的
HomeActivity
,但我需要知道有没有更好的方法来做。因为我不想每次在
家庭活动
中做任何更改时都进行复制


请在下面发表评论,以便我能改进我的错误。谢谢

技术上的答案是:不可能

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

当然,真正的答案是:您必须后退一步,明确地构建您的整个解决方案。单是18K线就意味着这里有严重的问题。有人可能会提到好的老原则,但是:18K行代码意味着很多代码和特性。在stackoverflow问题上,一个单一的答案根本不可能为您提供正确的指导


所以,固执己见:你应该退后一步,找一些(架构)专家谈谈。然后和他们坐下来(可能几个小时,甚至几天),看看你有什么,你想去哪里。然后在那个条路上一起工作。其他任何事情都只是在症状上贴上创可贴。当然,如果你不这样做,什么都不会坏。但每向前一步都会让事情变得一团糟,让每一步都变得更昂贵。迟早,改变你的巨石将变得几乎不可能,每个人都会要求“扔掉它,从头开始”

技术上的答案是:不可能

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

当然,真正的答案是:您必须后退一步,明确地构建您的整个解决方案。单是18K线就意味着这里有严重的问题。有人可能会提到好的老原则,但是:18K行代码意味着很多代码和特性。在stackoverflow问题上,一个单一的答案根本不可能为您提供正确的指导


所以,固执己见:你应该退后一步,找一些(架构)专家谈谈。然后和他们坐下来(可能几个小时,甚至几天),看看你有什么,你想去哪里。然后在那个条路上一起工作。其他任何事情都只是在症状上贴上创可贴。当然,如果你不这样做,什么都不会坏。但每向前一步都会让事情变得一团糟,让每一步都变得更昂贵。迟早,改变你的巨石将变得几乎不可能,每个人都会要求“扔掉它,从头开始”

> P>作为GhostCat优秀答案的补充,我将在OOP中给出一个非常重要的提示:为了增强<强>运行时< /强>对象的行为,装饰器模式通常是一种考虑的方式。p> 这里,
HomeActivity
显示为装饰元素,
ARBaseACtivity
NonARBaseActivity
显示为装饰元素。
您应该定义一个
MyActivity
接口,它是修饰对象和装饰对象的基类

因此,事情并不简单,因为您将不得不重构许多代码行,但这将使您的设计更加灵活,并且使用具有一致责任的类,而不是使用god对象作为活动

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

public MyActivity computeHomeActivity(){

    HomeActivity activity = new HomeActivity();

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

}

作为GhostCat优秀答案的补充,我将在OOP中给出一个非常重要的提示:为了增强<强>运行时< /强>对象的行为,装饰器模式通常是一种考虑的方式。 这里,

HomeActivity
显示为装饰元素,
ARBaseACtivity
NonARBaseActivity
显示为装饰元素。
您应该定义一个
MyActivity
接口,它是修饰对象和装饰对象的基类

因此,事情并不简单,因为您将不得不重构许多代码行,但这将使您的设计更加灵活,并且使用具有一致责任的类,而不是使用god对象作为活动

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

public MyActivity computeHomeActivity(){

    HomeActivity activity = new HomeActivity();

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

}

如果类具有不同的行为,则需要创建两个类。但是尝试将继承类中的所有公共代码共同化如果它们有不同的行为,则需要创建两个类。但是试着将继承类中的所有公共代码共同化是的,你是对的,从一开始我没有遵循任何体系结构,现在已经1.5年了,需求就像我必须在一个活动中完成所有事情,现在看起来很混乱。我必须遵循一些架构并进行一些优化。无论如何,谢谢你的回答!!是的,你是对的,从一开始我没有遵循任何架构,现在已经1.5年了,要求我必须在一个活动中完成所有事情,现在看起来一团糟。我必须遵循一些架构并进行一些优化。任何