2010-05-23 25 views
1

我遇到了一些我正在做的繼承問題。基本上,我有一個叫做LineCalculator的抽象類,正如它所暗示的那樣,它計算方程的線。從那裏開始,我繼承了基類LinearLineCalculator(計算笛卡爾座標系上的直線)和PolarLineCalculator(計算極座標系上的直線)。如何在Java中處理可互換的基類

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值,並將它們報告給基類。基類然後處理從由線程計算的數據構造線。

我的問題是我已經實現了一個修改後的版本,它以順序方式計算,其中基類在每個線程上阻塞,直到它獲得第一個值。然後等待第二個有序值,以此類推,允許它在飛行中構建線。

這個繼承模型完美地工作,因爲我能夠在不修改任何繼承者的情況下修改基類並使其仍然有效。但是我希望能夠交換實現這些實現,例如對於某些行,將其計算爲「free for all」風格,對於某些行,按順序計算它。

我的問題是有沒有一種模式或設計可以讓我改變基類實現,但保持超類實現而不違反DRY原則?

回答

6

聽起來像你真的想組成,不一定是繼承。

我會有一個Calculator接口,帶有矩形和極座標的實現。給計算出來的類一個你在其構造函數中初始化的Calculator引用。這可以讓您輕鬆地更換實施。你還需要一個CalculatorFactory。

+0

我喜歡這個想法,但我有點困惑,爲什麼我需要一個工廠。我不能只使用像'new LineConstructor(新的PolarCalculator())'的東西嗎? – mgbowen 2010-05-23 15:39:31

+2

你可以,但你會被綁定到你創建「新」的任何課程。工廠或更好的依賴注入解決方案允許您更改配置而不是重寫代碼。 – duffymo 2010-05-23 15:50:07

+1

啊,這是有道理的。謝謝,你的答案將完美無缺! – mgbowen 2010-05-23 15:53:26

相關問題