由于“不允许在派生类之间进行用户定义的转换,”在我的情况下是否有一个不错的替代方案?

时间:2013-02-25 17:32:37

标签: c# .net

我的测量应用程序有一个继承自Matrix类的Vector类,它公开适用于1D矢量类型矩阵的操作。可以预见,即使底层阵列不是一维的,有人也会尝试将矩阵向下转换为矢量。然后他们不会知道在其中一个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]);
}

我得到了标题的例外。有什么方法可以避免吗?

1 个答案:

答案 0 :(得分:3)

您的类型层次结构存在问题。 Vector不应该首先从Matrix继承 - 这是对经典circle/ellipse problem的另一种看法。

此外,在当前层次结构上向Matrix投射Vector是向下转发的。向下转换绝不保证安全,因此您的用户应该期望转换可能会失败。即使你不知何故,你也不应试图掩盖这一点。

最后,没有什么可以阻止您提供AsVector3()方法来完全按照建议的转换运算符执行的操作。