如何处理Java中的可互换基类

时间:2010-05-23 15:31:32

标签: java inheritance

我遇到了一些我正在做的继承问题。基本上,我有一个名为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原则?

1 个答案:

答案 0 :(得分:5)

听起来像你真的想要作曲,而不一定是继承。

我有一个Calculator接口,具有Rectangular和Polar实现。为执行计算的类提供在其构造函数中初始化的Calculator引用。这使您可以轻松地交换实现。你也需要一个CalculatorFactory。