Java中如何处理可交换基类

Java中如何处理可交换基类,java,inheritance,Java,Inheritance,我在继承遗产方面遇到了问题。基本上,我有一个名为LineCalculator的抽象类,正如它所建议的,它计算方程的线条。从那里,我在LinearLineCalculator和PolarLineCalculator中继承了这个基类,前者在笛卡尔坐标系中计算直线,后者在极坐标系中计算直线 public abstract class LineCalculator { // Begins calculating a line based on the parameters protec

我在继承遗产方面遇到了问题。基本上,我有一个名为LineCalculator的抽象类,正如它所建议的,它计算方程的线条。从那里,我在LinearLineCalculator和PolarLineCalculator中继承了这个基类,前者在笛卡尔坐标系中计算直线,后者在极坐标系中计算直线

public abstract class LineCalculator {

    // Begins calculating a line based on the parameters
    protected final Path2D.Double calculateLine(...) {
    }

    // Takes in an X value, does something with it, 
    // and returns the resulting X and Y values
    protected abstract double[] handlePoint(double x);
}
因此,LinearLineCalculator只是用一个方程计算相应的Y值,而PolarLineCalculator则根据方程和X值计算半径,并将其转换为极坐标。在这种情况下,X表示θ,单位为度或弧度

LineCalculator然后以一种完全免费的方式计算该行,其中计算该行的线程以尽可能快的速度计算X和Y值,并将其报告给基类。然后,基类处理从线程计算的数据构造线

我的问题是,我已经实现了一个修改过的版本,它是按顺序计算的,基类在每个线程上阻塞,直到它得到第一个值。然后,它等待第二个有序值,依此类推,允许它动态构造行

这个继承模型工作得很好,因为我能够在不修改任何继承器的情况下修改基类,并且使它仍然工作。但我希望能够互换地切换实现,例如对于某些行,对所有样式免费计算,对于某些行,按顺序计算


我的问题是,是否有一种模式或设计允许我更改基类实现,但保留超类实现而不违反DRY原则?

听起来你真的想要合成,而不是继承


我有一个计算器界面,有矩形和极坐标的实现。为进行计算的类指定一个计算器引用,并在其构造函数中初始化该引用。这使您可以轻松地交换实现。你还需要一个计算器工厂。

听起来你真的想要合成,而不是继承


我有一个计算器界面,有矩形和极坐标的实现。为进行计算的类指定一个计算器引用,并在其构造函数中初始化该引用。这使您可以轻松地交换实现。你也需要一个计算器工厂。

我喜欢这个主意,但我有点困惑,为什么我需要一个工厂。我能不能使用像new LineConstructor或new PolarCalculator这样的东西?你可以,但你将绑定到你创建的任何新类。工厂或者更好的依赖注入解决方案可以让您更改配置,而不是重写代码。啊,这是有道理的。谢谢,你的答案会很好用的!我喜欢这个想法,但我有点困惑,为什么我需要一个工厂。我能不能使用像new LineConstructor或new PolarCalculator这样的东西?你可以,但你将绑定到你创建的任何新类。工厂或者更好的依赖注入解决方案可以让您更改配置,而不是重写代码。啊,这是有道理的。谢谢,你的答案会很好用的!