【发布时间】: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