我在创建两个共享大量代码的类时遇到了一个问题,子类的一个属性意味着它是超类中属性的一个子类。让我举一个虚拟的例子来说明问题的根源是什么:
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是驻留在另一个包中的类,因此需要所有这些类,但是不同的操作需要是自包含的。一个用例是一个程序的两个扩展,一个扩展取决于另一个扩展的代码。这些扩展应该解决同一问题的不同部分,但是超级扩展不应该与继承扩展有交叉依赖关系。
1条答案
按热度按时间pepwfjgg1#
你为什么需要y班?使用泛型,可以将类x与类型a或类型b一起使用。