首页 > 解决方案 > 包中的类如何使用另一个版本的对象类型?

问题描述

我需要创建一个包含两个包的 Java 项目:com.myPackagecom.myPackage.subpackage.

这两个包包含以下类:

/* **************************************** */
package com.myPackage.subpackage;

public class ClassA {
      public ClassB cB = new ClassB();  // Here I need to have NewClassB instead of ClassB
      // ...
}

public class ClassB extends ClassC {
    public void doSomething() {
        // ...
    }
}

/* **************************************** */
package com.myPackage;

public class NewClassB extends ClassC {
    public void doSomethingElse() {
        // ...
    }
}

我的问题是:我想保留subpackage“多用途”(与我现在正在构建的应用程序的特殊情况无关),以便将来重新使用它。但是在我的应用程序中,我还需要在 object 的定义中ClassA使用NewClassB而不是, :我该怎么做?我以为我可以创建一个接口,然后在.. 中实现它,但后来我无法在 .. 中实例化对象,因为它将是一个接口。此外,并且必须扩展另一个类 ( )。ClassBcBClassBNewClassBcBClassAClassBNewClassBClassC

有人可以提供建议吗?

提前致谢。

编辑:为清楚起见,我不想NewClassBsubpackage. 另外,我无法定义NewClassAwhich uses NewClassB,因为在我的实际应用程序NewClassA中,它又被其他类使用,那么我最终会做New所有这些的版本......

标签: java

解决方案


您总是准确地实例化您想要的类(如果您考虑一下,这是有道理的,JVM 应该如何知道您现在想要哪个特定的子类?)

听起来你想NewClassB扩展ClassB.

public class NewClassB extends ClassB {...}

那么您可以将其用作

public class ClassA {
      public ClassB cB = new NewClassB();  
}

由于继承,将 的实例分配给NewClassB类型ClassB化变量,甚至ClassC在这种情况下(因为ClassBextends ClassC)分配给类型化变量是绝对没问题的。

如果您不想ClassA对 的具体实现有任何了解ClassB,您可以简单地在构造函数中传递它:

public class ClassA {
    public ClassB cB;

    public ClassA(ClassB cB){
        this.cB = cB;
    }
}

这对您的问题有帮助吗?


推荐阅读