2011-02-16 89 views
7

對於一個數學包,我試圖爲不同類型的矩陣設置類,如典型的矩形矩陣,三角矩陣,對角矩陣等。原因很自然地節省了高效的存儲空間,高效的算法實現特殊矩陣。但是我仍然希望具有超載運算符的靈活性,其中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 patternVisitor pattern,但不適用於op過載。解決這個問題最好的辦法是什麼?這裏

  1. 一個related thread

    資源我迄今發現的。

  2. Explanation of a similar problem面向另一個OS C#數字封裝的開發者。

編輯:

2011年4月25日:增加更多的資源,到目前爲止,我還發現了這個問題。

+0

有一些現有的數學庫,你可以使用,或採取的想法:http://stackoverflow.com/questions/2336701/recommendation-for-c-matrix-library – 2011-02-16 17:35:14

+0

@Merlyn:我曾考慮過,但有政策問題,所以我將不得不開發自己的。 (還是)感謝你的建議。 – 2011-02-16 18:50:29

回答

7

如果這是我的項目,我會選擇#1的變體:定義一個抽象Matrix類,它由更具體的類型繼承,如TriangularMatrix。這將允許您創建運算符(即使所述運算符只是拋出NotImplementedException),然後您可以在派生類中重寫。它也將允許您將任何矩陣作爲矩陣處理,並具有該共同的一組功能。

您唯一會失去的是編譯器會檢查您是否實際覆蓋了方法和運算符;由於運營商是靜態的,因此不能將其抽象化。如果希望,可以通過使基類中的運算符調用等效的命名方法(例如,+會調用Add方法)來在基類中抽象,從而強制子類實現它。數學問題:可以將三角矩陣添加到矩形矩陣,還是兩個加數必須在類型和/或維數上匹配?如果是前者,考慮在基類的Matrix類中實現操作符,並讓該操作符實現一個策略模式,調用可以對每個類型組合執行實際操作的內部類。如果是後者,只需重寫該類型矩陣的有效運算符的基類實現即可。