超类的子类中的子类属性超类中的子类属性

7nbnzgx9  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(470)

我在创建两个共享大量代码的类时遇到了一个问题,子类的一个属性意味着它是超类中属性的一个子类。让我举一个虚拟的例子来说明问题的根源是什么:

public class A {
}

public class B extends A{
}

public class X{
 A value;
}
public class Y extends X{
 B value;
}

共享代码根据情况使用a或b。在运行时调试类b的操作时,将值转换为protected并忽略问题是行不通的,而在共享方法中,我可以看到y.value被填充,而x.value没有,最终引发了nullpointerexception。为了解决这个问题,我考虑在设计中添加一个泛型类型t,因此:

public class A {
}

public class B extends A{
}

public class X<T extends A>{
 T value;
}
public class Y extends X<B>{
}

这似乎管用。然而不幸的是,有一部分代码试图用默认构造函数初始化a或b,这迫使我用try-catch handlers之类的命令来增加代码的复杂性,否则就不需要这些命令了。解决这种情况的另一种方法是引入父类p:

public class A {

public class B extends A{
}

/**The abstract class has abstract the method that creates the T object

* /

public abstract class P<T extends A> {

}

public class X extends P<A>{
}
public class Y extends P<B>{
}

或者在p位置创建一个接口,这将导致需要创建大量静态方法,这些方法需要在实现类中显式调用
最后,我想问的是,是否有比我建议的更好的解决方案,或者上述哪种模式似乎是最好的选择。仅供参考,我来自python背景,由于duck类型,我没有遇到过这种情况。
编辑我提出这个问题的原因是,a和x是驻留在一个包中的类,b和y是驻留在另一个包中的类,因此需要所有这些类,但是不同的操作需要是自包含的。一个用例是一个程序的两个扩展,一个扩展取决于另一个扩展的代码。这些扩展应该解决同一问题的不同部分,但是超级扩展不应该与继承扩展有交叉依赖关系。

pepwfjgg

pepwfjgg1#

你为什么需要y班?使用泛型,可以将类x与类型a或类型b一起使用。

public class A {
}

public class B extends A {
}

public class X<T extends A> {

    private final T value;

    public X(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

public static void main(String[] args) {
    A a = new A();
    B b = new B();
    X<B> xb = new X<>(b);
    X<A> xa = new X<>(a);
}

相关问题