2014-10-11 96 views
4

我正在學習C#並決定爲矩陣及其功能編寫一個類庫以獲得一些經驗和實踐。設計良好的類和層次結構

好了,現在我有下面的類模型:

class Matrix // For rectangular matrices 
{ } 

class SquareMatrix : Matrix 
{ } 
class RowMatrix : Matrix 
{ } 
class ColumnMatrix : Matrix 
{ } 

每個類的具有合適的構造採取尺寸或特定矩陣的順序。

現在我的SquareMatrix類有一個特定的功能來查找並返回行列式。我在這裏遇到的問題是,如果我的庫的用戶創建了維度爲n和n的Matrix類型的實例,那麼他將無法使用Determinant()方法,因爲它只駐留在SquareMatrix中,而他的實例的類型爲Matrix 。

其他方法也會出現類似的問題。


所以我的問題是:

  1. 是我的一流的設計缺陷?
  2. 有什麼辦法可以解決這個問題嗎? (OR(儘管它有一個難得的機會),我應該還是期待用戶正確實例化對象?)

謝謝大家提前:)

+1

沒有完美的解決方案,這種關係在繼承方面表現不佳。參見[圓橢圓問題](http://en.wikipedia.org/wiki/Circle-ellipse_problem)。 – 2014-10-11 06:59:16

+0

真的很好鏈接,謝謝! – crazyGamer 2014-10-11 13:05:35

+0

那麼當然最簡單的解決方案就是簡單地拋棄所有的繼承,並有異常或布爾返回來檢查有效性。但是,這不是真正的OOP是... – crazyGamer 2014-10-11 13:22:23

回答

1

什麼你作戰反對這裏是里氏替代原則。基本上你需要做的不是使用舊的「...是...」來制定超級/子類。而是嘗試使用「...可替代...」

如果您剛剛開始使用C#,則應首先了解SOLID的原理。關於你回答的工作和L

這將幫助你與L,http://www.oodesign.com/liskov-s-substitution-principle.html

檢查這一個固體,http://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp

當你想對我和d工作打我,他們是我的最愛

戴爾

1

不錯的問題。

我會認爲:

用戶應該負責實例化正確的實例。如果用戶想要Matrix,那麼他就是這樣。如果該功能在Matrix中不存在,那就太糟糕了。

但是,如果你有一個共同的功能,根據它是什麼類型的矩陣表現不同,那麼在這種情況下,你會創建一個返回矩陣的工廠。它會根據參數返回適當的矩陣。用戶可以在Matrix上調用函數,但根據實際返回的矩陣,行爲實際上會有所不同。

+0

好主意。所以我可以使所有構造函數都是私有的,並有另一個靜態成員來實例化並返回適當類型的矩陣。但是,那麼我會不要求用戶使用「動態」創建對象來允許這樣做?並且動態沒有輕微的性能打擊? – crazyGamer 2014-10-11 13:09:59