我想到了两个可能的想法,这两个想法都很混乱:
(1)IMatrix接口,它列出了需要为每种类型的矩阵实现的所有方法,例如转置,反转等,其有效实现对于每种类型的矩阵是不同的.这里有两个问题:(a)运算符重载是静态方法,因此不能在接口中列出,甚至不能在实现接口的基类中列出.运算符重载必须分别写在每个类中,并且我不可能实现C = A B类型操作(如上所述),而不是在客户端代码中进行混乱类型检查和转换,我真的想避免. (b)当我定义运算符重载时,我不能将两个操作数都作为接口:即,我不能在DiagonalMatrix类中执行以下操作:
public override IMatrix operator +(IMAtrix lhsMatrix,IMatrix rhsMatrix) { ... }
(2)可以有一个矩阵类,矩阵类型变量存储在类中(可以是枚举).根据类型,我们可以实现数据结构和算法.然后,运算符重载将无缝地工作.这里存在一个问题:(a)在启动特定算法之前,类可能会有很大的可能用于检查矩阵类型的switch-case语法.对于每个二元运算符,我必须有n ^ 2个case,n是我想要实现的矩阵类型的数量.也可能是维护噩梦.
看起来,如果没有运算符重载细节,我可以使用Factory pattern或Visitor pattern,但不能使用op重载.什么是解决这个问题的最佳方法?
到目前为止我找到的资源:
>一个related thread在这里.
> Explanation of a similar problem面对另一个OS C#Numerics包的开发.
编辑:
4/25/2011:到目前为止,我已经找到了有关此问题的更多资源.
解决方法
你唯一会失去的是编译器检查你实际上是否覆盖了方法和运算符;由于运算符是静态的,因此不能使它们变得抽象.如果您愿意,可以通过使基类中的运算符简单地调用可以在基类中抽象的等效命名方法(例如,将调用Add方法)来解决此问题,从而强制子类实现它.
数学问题:可以将三角矩阵添加到矩形矩阵中,还是两个加数必须在类型和/或尺寸上匹配?如果是前者,请考虑在基类Matrix中实现运算符,并让该运算符实现策略模式,调用可以对每种类型组合执行实际操作的内部类.如果是后者,只需覆盖该类型矩阵的有效运算符的基类实现.