【问题标题】:Subclass attribute in Subclass of superclass attribute in Superclass超类中超类属性的子类中的子类属性
【发布时间】:2021-03-13 23:00:58
【问题描述】:

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

public class A {
}

public class B extends A{
}

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

共享代码根据情况使用 A 或 B。将值转换为受保护并忽略问题不起作用,在运行时调试 B 类的操作,而在共享方法中,我可以看到 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 处理程序之类的命令来增加代码的复杂性,否则将不需要这些命令。解决这种情况的另一种方法是引入父类 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 背景,由于鸭子打字,我没有遇到过这种情况。

编辑 我提出这个问题的原因是 A 和 X 是驻留在一个包中的类,而 B 和 Y 是驻留在另一个包中的类,因此它们都是必需的,但不同的操作需要自包含。一个用例将是一个程序的两个扩展,一个扩展依赖于另一个扩展的代码来工作。扩展应该解决同一问题的不同部分,但超扩展不应该与继承的有交叉依赖。

【问题讨论】:

    标签: java inheritance design-patterns subclass decoupling


    【解决方案1】:

    为什么需要 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);
    }
    

    【讨论】:

    • 感谢您指出缺少上下文,我更新了描述
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多