Java 包中的类如何使用对象类型的另一个版本?

Java 包中的类如何使用对象类型的另一个版本?,java,Java,我需要创建一个包含两个包的Java项目:com.myPackage和com.myPackage.subpackage 这两个包包含以下类: /* **************************************** */ package com.myPackage.subpackage; public class ClassA { public ClassB cB = new ClassB(); // Here I need to have NewClassB ins

我需要创建一个包含两个包的Java项目:
com.myPackage
com.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() {
        // ...
    }
}
我的问题是:我想保留
子包
“多用途”(与我现在构建的应用程序的特殊情况无关),以便将来可以重复使用它。但是在我的应用程序中,我还需要
ClassA
在对象
cB
的定义中使用
NewClassB
而不是
ClassB
:我怎么做? 我想我可以创建
ClassB
作为接口,然后在
NewClassB
中实现它。。但是我不能在
ClassA
中实例化对象
cB
,因为它是一个接口。 另外,
ClassB
NewClassB
必须扩展另一个类(
ClassC

有人能提供建议吗

提前谢谢

编辑: 为清楚起见,我不希望在
子包中的任何位置命名或定义
NewClassB

另外,我不能定义一个使用
NewClassB
NewClassA
,因为在我的实际应用程序中,
NewClassA
反过来被其他类使用,那么我最终会做所有类的
New
版本…

你总是准确地实例化你想要的类(仔细想想,这是有道理的,否则JVM怎么知道您现在想要哪个特定的子类?)

听起来好像您希望
NewClassB
扩展
ClassB

public类NewClassB扩展ClassB{…}
然后你就可以把它当作

公共类ClassA{
public ClassB cB=NewClassB();
}
由于继承,将
NewClassB
的实例分配给
ClassB
类型化变量,甚至分配给
ClassC
类型化变量(因为
ClassB
扩展了
ClassC

如果您希望
ClassA
不了解
ClassB
的具体实现,只需在构造函数中传递它:

公共类ClassA{
公共B类cB;
公共A类(B类cB){
this.cB=cB;
}
}

这对您的问题有帮助吗?

看起来您应该能够将类A扩展到新类A,并使新类B扩展类B(这意味着它也可以传递地扩展类C)。然后重写新类A的构造函数以分配
cB=new NewClassB()
,这是合法的,因为新类B仍然是类B


您还可以创建ClassB和抽象类(而不是接口),然后可以使用静态工厂方法构造并返回具体实现(ClassBImpl),但也可以为您的特殊用例使用不同的版本(ClassBNewImpl),在这种情况下ClassBImpl和ClassBNewImpl都扩展ClassB(抽象),它本身扩展了ClassC,但以这种方式ClassBImpl都不会直接扩展另一个。

如果你想要一个
NewClassB
,那么就做一个。你正在构建一个
ClassB
,结果得到一个
ClassB
。我不明白你期望发生什么事。我解释说:我做了一个
NewClassB
,b但是我不想把它放在
ClassA
的同一个包中(它不能明确引用
NewClassB
)。那么我如何让
ClassA
使用
NewClassB
?@user14520608您能否提供
ClassB
实例作为
ClassA
的构造函数的参数,并以这种方式保存在
cB
?(关键字:依赖注入)@Progman:我认为这不起作用,因为即使我将
cB
作为参数传递,我也必须定义它的类型,
ClassB
NewClassB
是不同的类型,…@user14520608使用新接口或
ClassC
作为新构造函数参数的类型。谢谢,这非常有启发性!是的,我的观点是这样的我不希望
NewClassB
被写入
子包中的任何地方(这样我将来就可以将其用于其他目的)。那么您的解决方案n.2似乎很有趣。我是否能够将
cB
作为
ClassB
传递,即使它实际上是一个
NewClassB
?Thanks@user14520608如果
NewClassB
类型为
ClassB
(aka扩展
ClassB
)例如,如果您有两个类
Apple
Pear
,它们都扩展了类
Fruit
,并且您有一个方法需要类型为
Fruit
的参数,那么您将能够传递其中一个(或您定义的任何其他子类)@user14520608如果您想从实际实现中分离一些代码,通常的方法是让一个接口定义您需要的方法,并使用该接口类型的参数/变量。这意味着您将能够直接或间接地处理实现该接口的任何类。谢谢您,您的解决方案第二部分很有趣。