我有一个对象A
,在实例化后,我会对其状态执行各种操作。在A
的方法中,我需要创建另一个类的多个实例(称为B
)。对象类B
严重依赖于A
的大部分状态,实例可以影响A
的状态。
问题如下。由于A
已经实例化并且在调用A
中的方法之前对其状态进行了操作,需要对B
进行任何实例化,因此如何使用继承来编写B
我的班级,因为我不想在super()
内拨打B
(因为A
已经实例化了)?
我是否必须将B
的班级与A
班级合并在一起?
public class Test {
public static void main(String[] args) {
ClassA instanceA = new ClassA(5000000L); //Initial instantiation and state-setting operation to A.
instanceA.update(); //Try to get A to create B, where B relies on A's new state from previous operations.
}
}
class ClassA {
long tempLong;
ClassB instanceB;
public ClassA(long setLong) {
tempLong = setLong;
}
public void update() {
this.instanceB = new ClassB(); //instanceA needs an instanceB to work with.
}
}
class ClassB extends ClassA {
long tempLong2;
public ClassB() {
// I don't want to call super() here because instanceA is already created and instanceA's state is already set!;
this.tempLong2 = super.tempLong*2; //instaceA's state is necessary for instanceB to function!
}
}
答案 0 :(得分:1)
您的设计存在根本性缺陷。当你致电update()
public void update() {
this.instanceB = new ClassB(); //instanceA needs an instanceB to work with.
}
新ClassB
实例与this
ClassA
实例相关,仅仅因为ClassB extends ClassA
。不,情况并非如此,因为new ClassB()
创建了一个全新的Object
,其ClassA
状态与this
不同。
如果ClassB
依赖于ClassA
的唯一属性是温度,那么最好将其传递给构造函数并在此处废弃继承(如果ClassB
IS-NOT-A { {1}})。
ClassA
如果依赖项需要访问几乎所有public void update() {
this.instanceB = new ClassB(this.tempLong);
}
public ClassB(long tempLong) {
this.tempLong2 = tempLong * 2;
}
属性,那么通过将ClassA
实例传递给ClassA
来支持HAS-A优于继承可能更有意义。
ClassB