對於一個數學包,我試圖爲不同類型的矩陣設置類,如典型的矩形矩陣,三角矩陣,對角矩陣等。原因很自然地節省了高效的存儲空間,高效的算法實現特殊矩陣。但是我仍然希望具有超載運算符的靈活性,其中C = A + B將A和B作爲任何類型的矩陣並返回相應的結果(如果其中一個操作數是矩形的,結果可以降級爲典型的矩形矩陣) 。關於繼承和操作符重載的OOP設計問題
我已經想到了2個可能的想法,這兩者都是凌亂:
(1)一種IMatrix接口,這將列出所有需要爲每種類型的矩陣的要實現的方法,例如,轉置,逆等等,對於每種類型的矩陣來說,其有效實現是不同的。這裏有兩個問題:(a)操作符重載是靜態方法,因此不能在接口中列出,甚至不能在實現接口的基類中列出。運算符重載必須分別寫在每個類中,並且我不可能實現C = A + B類型的操作(如上所述),而不會在客戶端代碼中進行凌亂的類型檢查和投射,我真的很想避免。 (b)中我不能有兩個操作數作爲接口時我定義操作符重載:即我不能執行以下操作中,比如,對角矩陣類:
public override IMatrix operator +(IMAtrix lhsMatrix, IMatrix rhsMatrix)
{ ... }
(2)可具有存儲在矩陣型變量一個矩陣類在課堂上(可能是Enum)。根據類型,我們可以實現數據結構和算法。操作員超載可以無縫工作。這裏存在一個問題:(a)在啓動特定算法之前,該類將會有巨大的可能的開關語法來檢查矩陣類型。對於每個二元運算符,我必須有n^2個例子,n是我想要實現的矩陣類型的數量。也可能是維修的噩夢。
看起來,沒有操作員超載的細節,我可以使用Factory pattern或Visitor pattern,但不適用於op過載。解決這個問題最好的辦法是什麼?這裏
- 一個related thread:
資源我迄今發現的。
- Explanation of a similar problem面向另一個OS C#數字封裝的開發者。
編輯:
2011年4月25日:增加更多的資源,到目前爲止,我還發現了這個問題。
有一些現有的數學庫,你可以使用,或採取的想法:http://stackoverflow.com/questions/2336701/recommendation-for-c-matrix-library – 2011-02-16 17:35:14
@Merlyn:我曾考慮過,但有政策問題,所以我將不得不開發自己的。 (還是)感謝你的建議。 – 2011-02-16 18:50:29