针对一个数学包,我试图创建不同类型矩阵的类,例如典型的矩形矩阵、三角形矩阵、对角线矩阵等。自然而然的原因是为了节省特殊矩阵的高效存储和高效算法实现。但我仍希望具有重载运算符的灵活性,其中C = A + B将A和B作为任何类型的矩阵,并返回相应的结果(如果操作数之一是矩形,则结果可以降级为典型的矩形矩阵)。
我想到了两个可能的想法,但都很混乱:
(1)IMatrix接口,列出每种类型矩阵需要实现的所有方法,例如转置、逆等。这些方法的高效实现对于每种类型的矩阵都不同。这里有两个问题: (a) 运算符重载是静态方法,因此无法在接口中列出,甚至不能在实现接口的基类中列出。必须在每个类中单独编写运算符重载,否则我无法实现C=A+B类型的操作(如上所述),而且客户端代码中会出现混乱的类型检查和强制转换,这是我真正想避免的。(b) 当我定义运算符重载时,我不能将两个操作数都定义为接口: 例如,在DiagonalMatrix类中无法执行以下操作:
我想到了两个可能的想法,但都很混乱:
(1)IMatrix接口,列出每种类型矩阵需要实现的所有方法,例如转置、逆等。这些方法的高效实现对于每种类型的矩阵都不同。这里有两个问题: (a) 运算符重载是静态方法,因此无法在接口中列出,甚至不能在实现接口的基类中列出。必须在每个类中单独编写运算符重载,否则我无法实现C=A+B类型的操作(如上所述),而且客户端代码中会出现混乱的类型检查和强制转换,这是我真正想避免的。(b) 当我定义运算符重载时,我不能将两个操作数都定义为接口: 例如,在DiagonalMatrix类中无法执行以下操作:
public override IMatrix operator +(IMAtrix lhsMatrix, IMatrix rhsMatrix)
{ ... }
(2) 可以在一个Matrix类中有一个存储在类中的矩阵类型变量(可以是枚举)。根据类型,我们可以实现数据结构和算法。运算符重载将无缝工作。这里有一个问题:(a) 类会很大,并且可能需要使用switch-case语法来检查矩阵类型,然后启动特定的算法。对于每个二进制运算符,我都必须有n^2个情况,其中n是我想要实现的矩阵类型的数量。这也可能是维护的噩梦。
看起来,没有运算符重载的详细信息,我可以使用工厂模式或访问者模式,但是不能使用运算符重载。那么,如何解决这个问题呢?
到目前为止,我找到的资源:
- 这里有一个相关主题。
- 另一个操作系统 C# 数字包的开发者面临类似问题的解释。
编辑:
2011年4月25日: 我找到了更多关于这个问题的资源。