涉及超类内的子类实例的继承

时间:2013-10-08 05:25:28

标签: java inheritance subclass superclass

我有一个对象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!
    }
}

1 个答案:

答案 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