2013-02-25 28 views
2

我的測量應用程序有一個從類Matrix繼承的Vector類,它暴露適合於一維向量類型矩陣的操作。更可怕的是,即使底層數組不是一維,也有人會嘗試將矩陣向下轉換爲向量。然後,在Vector操作之一發生異常之前,他們不會知道有問題。但如果我嘗試實施演員表,即:既然「不允許用戶自定義轉換到派生類或從派生類轉換,」在我的情況下是否有一個不錯的選擇?

public static explicit operator Vector3(Matrix m) 
{ 
    if (m.Array.GetLength(0) != 3 && m.Array.GetLength(1) != 1) 
     throw new InvalidCastException("The matrix dimensions are invalid."); 
    return new Vector3(m[0, 0], m[1, 0], m[2, 0]); 
} 

我得到標題的例外。有什麼辦法可以避免它?

回答

3

您的類型層次結構存在問題。 Vector首先不應該從Matrix繼承 - 這是經典circle/ellipse problem的另一種選擇。

此外,將Matrix投射到當前層級上的Vector是向下投射。 Downcasting不能保證安全,所以你的用戶應該預計演員可能會失敗。即使你以某種方式可以,你也不應該試圖掩蓋這一點。

最後,沒有什麼能阻止您提供AsVector3()方法來完成擬議的轉換運算符的功能。

+0

感謝您的知識豐富的迴應。什麼樣的矢量不是矩陣? – 2013-02-25 18:30:29

+0

@BrandonArnold:實際上這意味着「不是所有的矩陣都是矢量」,這當然不會描述你的層次結構。所以讓我們假裝那部分從未發生過。 ;-) – Jon 2013-02-25 18:32:21

+0

哈哈,哦,我明白了。 – 2013-02-25 18:35:31

相關問題