【问题标题】:Java objects- avoiding duplicate codeJava 对象——避免重复代码
【发布时间】:2023-03-22 17:17:01
【问题描述】:

假设我有两种类型的对象,我不会提前知道将使用哪个对象。我也想应用用于在特定方法中执行相同操作的任何对象。如何在不重复代码的情况下做到这一点?

例如:

if (input=1){
    version1 version = new version1()
}
else{
    version2 version = new version2()
}

**do something with version**

显然这种方式不会编译,但是我需要做什么来完成我想要实现的目标?

也许我必须尝试一下?抱歉,我还是 java 新手。

【问题讨论】:

  • version1version2是什么关系?他们实现相同的接口吗?他们有共同的祖先阶级吗?您要避免哪些代码重复?
  • 您可能还想要if (input == 1) { 而不是您当前拥有的:if (input = 1) {
  • 在我现实生活中的问题中,不同之处在于它们是从同一个表派生的不同 DOA java 类/对象,并且对于我们的目的可以被认为是相同的。我试图避免有两个单独的方法来调用做同样的事情

标签: java inheritance


【解决方案1】:

您可以拥有一个名为 Version 的超类。
Version1Version2 扩展这个超类。

那么你可以这样做:

Version version = null; // superclass reference
if (input == 1){
    version = new Version1(); // instance of subclass Version1
}
else{
    version = new Version2(); // instance of subclass Version2
}
// Now you can use the object version.

这在 Java 中称为 Runtime Polymorphism - 使用超类引用指向子类。 (因此,您无需提前知道将使用哪个对象,正如您在问题中提到的那样:))。

或者,您也可以使用名为 Version 的 Interface 来代替超类 Version。 在这种情况下 Version1Version2 实现 Version 而不是 extend 它。

注意:
我建议您阅读 Java 中的继承多态
还要尝试清楚地了解什么是接口超类等。
Here is a SO link 回答了“何时使用超类与接口”的问题。

【讨论】:

  • 我的两个 DOA 版本类已经扩展了同一个类。因此,无论该类是什么,我都可以在您的示例中使用它来连接两者?
  • 没错。如果它们已经扩展了同一个类,则使用该类来实例化子类的对象。谷歌在 Java 中的“运行时多态性”。这将向您解释它是如何工作的!
  • 当我尝试这个时,代码会在它们的超类中查找调用的方法(驻留在版本类中)......它们在那里不存在
  • 我不确定我理解您所说的“在其超类中的版本类中调用的方法”是什么意思?
  • 对不起。这两个版本都在其类中定义了方法。当我尝试访问这些方法时,代码现在查看它们正在扩展的类或希望我将调用转换为特定版本类
【解决方案2】:

这是你要找的吗?

public class Version1 implements Version{

//Version 1 stuff
}

public class Version2 implements Version{

//Version 2 stuff
}

然后你的代码:

Version version =null
if (input==1){
version = new Version1()
}
else{
version = new Version2()
}

//Do something with version

【讨论】:

  • Version version 应该在if-else 之前和之外声明。检查@rgamber 帖子。
  • 我想写同样的代码..但是你写得更快。:)
【解决方案3】:

您对Interfaces 的概念有多熟悉?您可以让 2 个类 Version1Version2 实现 Version 接口并执行以下操作:

Version version;

version = (input == 1)? new Version1() : new Version2();

您可以在此处阅读有关 Interfaces 的信息:Link

【讨论】:

    【解决方案4】:

    您可以创建一个接口,然后在两个不同的版本中实现该接口。

    所以你会:

    public interface InterfaceName {
    
        public int method1();
    }
    
    public class version1 implements InterfaceName {
    
        public int method1() {
            //code for method1
        }
    }
    
    public class version2 implements InterfaceName {
    
        public int method1() {
            //code to implement in a different way if needed
        } 
    }
    

    【讨论】:

      【解决方案5】:

      您可以让类实现特定的接口,并将您的特定版本代码放在接口方法实现器中

      class Version1 implements VersionInterface{
      
           public void versionCode(){
      /// your Version1 class specific code
        }
      }
      
      class Version2 implements VersionInterface{
      
           public void versionCode(){
      /// your Version1 class specific code
        }
      }
      
      VersionInterface version =null;
      if (input=1){
          version = new Version1()
      }
      else{
          version = new version2()
      }
      
      version.versionCode(); // Runtime polymorphism 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多