2013-02-25 30 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

相关问题