我遇到了一些我正在做的继承问题。基本上,我有一个名为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原则?
答案 0 :(得分:5)
听起来像你真的想要作曲,而不一定是继承。
我有一个Calculator接口,具有Rectangular和Polar实现。为执行计算的类提供在其构造函数中初始化的Calculator引用。这使您可以轻松地交换实现。你也需要一个CalculatorFactory。