2013-02-15 45 views
2

在圖表生成項目中,我有2個類。一個叫做BitmapChart,另一個叫做VectorChart。它們的所有屬性都是相同的,它們具有相同的方法(儘管有不同的實現)。有一個例外,那就是Generate()函數。在BitmapChart對象的情況下,它返回一個Stream,並且在VectorChart對象的情況下它返回一個XmlDocument。當孩子有不同的返回類型時,不能實現繼承

起初我以爲我應該使用繼承,都是'圖表',他們共享相同的屬性和方法。但後來我意識到多態性是不可能的,因爲不同的返回類型。

有沒有OO原則或設計模式我錯過了讓我的代碼更優雅?

回答

1

相同的方法(雖然有不同的實現)。

創建一個接口爲這些方法,如果你想能夠使用它們可互換。但由於Generate()方法做了不同的事情,請不要將它們包含在界面中。您可能應該命名它們不同,即GenerateStream()GenerateXml()

至於實現的交集(相同的屬性和方法的一部分),您應該嘗試分離邏輯和表示。所以這可能是更好的方法對你來說:

+--------+  +----------------------+ 
| Chart |  |  <<interface>> | 
|--------|  |  ChartRenderer | 
|-data |  |----------------------| 
|-labels |  |+setChart(Chart chart)| 
|- ... |  |+...     | 
+--------+  +----------------------+ 
         ^  ^
         |   | 
     +----------------+--+ +--+----------------+ 
     |BitmapChartRenderer| |VectorChartRenderer| 
     |-------------------| |-------------------| 
     |+generateStream() | |+generateXml()  | 
     +-------------------+ +-------------------+ 
+0

我喜歡這個解決方案,我現在可以平等地對待圖表,直到渲染。出於好奇,這是一種工廠模式嗎? – BBQ 2013-02-15 09:21:57

+1

不,但它與戰略模式類似。在真正的Strategy模式中,你會實現一個'Chart.render()'方法並將'ChartRenderer'實例傳遞給'Chart',但是我不會在沒有需要的情況下引入這個依賴。這個解決方案沒有我知道的模式名稱,它只是簡單的解耦。 – 2013-02-15 09:22:29