Java 包中的类如何使用对象类型的另一个版本?
我需要创建一个包含两个包的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
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如果您想从实际实现中分离一些代码,通常的方法是让一个接口定义您需要的方法,并使用该接口类型的参数/变量。这意味着您将能够直接或间接地处理实现该接口的任何类。谢谢您,您的解决方案第二部分很有趣。