java中的动态构造函数调用?
假设我有4个类:java中的动态构造函数调用?,java,inheritance,subtyping,Java,Inheritance,Subtyping,假设我有4个类:A,B,SA和SB,其中B扩展了A 和SB扩展SA 类A具有以下构造函数: private SA a; public A() { a = new SA(); } private SA a; public A() { this(new SA()); } protected A(final SA a) { this.a = a; } 显然,当我调用类B的构造函数时,因为B扩展了A 类A的构造函数也被调用。但在这种情况下,我希望 Ato doA=new SB()的
A
,B
,SA
和SB
,其中B扩展了A
和SB扩展SA
类A
具有以下构造函数:
private SA a;
public A() {
a = new SA();
}
private SA a;
public A() {
this(new SA());
}
protected A(final SA a) {
this.a = a;
}
显然,当我调用类B的构造函数时,因为B扩展了A
类A
的构造函数也被调用。但在这种情况下,我希望
A
to doA=new SB()的构造函数代码>而不是a=new SA()代码>
有没有一个简单的方法可以做到这一点
更改A
和B
的公共接口?是的。例如:
public A(YourEnum en) {
if (en == YourEnum.SA){
a = new SA();
} else {
a = new SB();
}
}
此外,根据您真正需要的内容,可以通过重载构造函数来完成
public A(){
a = new SA();
}
public A(YourObjectYouNeed dataNeededForAnotherConstructor){
//doing initialization stuff
a = new SB();
}
是的。例如:
public A(YourEnum en) {
if (en == YourEnum.SA){
a = new SA();
} else {
a = new SB();
}
}
此外,根据您真正需要的内容,可以通过重载构造函数来完成
public A(){
a = new SA();
}
public A(YourObjectYouNeed dataNeededForAnotherConstructor){
//doing initialization stuff
a = new SB();
}
只要有一个公共
构造函数和一个受保护的
构造函数:
private SA a;
public A() {
a = new SA();
}
private SA a;
public A() {
this(new SA());
}
protected A(final SA a) {
this.a = a;
}
然后在B
中:
public B() {
super(new SB());
}
只要有一个公共
构造函数和一个受保护的
构造函数:
private SA a;
public A() {
a = new SA();
}
private SA a;
public A() {
this(new SA());
}
protected A(final SA a) {
this.a = a;
}
然后在B
中:
public B() {
super(new SB());
}
依赖注入!不改变A和B的公共接口?不太好。@SotiriosDelimanolis好的,如果您可以更改A
或B
的公共接口,您会怎么做?最简单的方法是什么(减少更改)?使A
的构造函数接受SA
参数。为什么必须调用A
的构造函数?只有在B
的构造函数中调用super
时才会发生这种情况。@ThatiditGuy Errr。。。否:如果构造函数体不是以显式构造函数调用开始,并且所声明的构造函数不是原始类对象的一部分,那么构造函数体将以超类构造函数调用“super();”依赖项注入隐式开始!不改变A和B的公共接口?不太好。@SotiriosDelimanolis好的,如果您可以更改A
或B
的公共接口,您会怎么做?最简单的方法是什么(减少更改)?使A
的构造函数接受SA
参数。为什么必须调用A
的构造函数?只有在B
的构造函数中调用super
时才会发生这种情况。@ThatiditGuy Errr。。。否:如果构造函数体不是以显式构造函数调用开始的,并且所声明的构造函数不是原始类对象的一部分,那么构造函数体隐式地以超类构造函数调用“super();”开始,这看起来不是特别可维护的。如果我现在添加一个扩展了a
的C
,并希望传入一个SC
,该怎么办?突然,OCP被违反了。您正在添加一个全新的依赖项,而不是删除一个。这看起来不是特别可维护的。如果我现在添加一个扩展了a
的C
,并希望传入一个SC
,该怎么办?突然违反了OCP。您正在添加一个全新的依赖项,而不是删除一个。如果这两个类位于不同的包中,该怎么办。你不能做super(newsb())代码>。因为A(最终SA A)
是protected@foobar不,受保护的
的全部要点是它可以被另一个包中的子类访问。看一看,如果这两个类在不同的包中呢。你不能做super(newsb())代码>。因为A(最终SA A)
是protected@foobar不,受保护的
的全部要点是它可以被另一个包中的子类访问。看一看。