对于一个数学包,我试图为不同类型的矩阵设置类,如典型的矩形矩阵,三角矩阵,对角矩阵等。原因很自然地节省了高效的存储空间,高效的算法实现特殊矩阵。但是我仍然希望具有超载运算符的灵活性,其中C = A + B将A和B作为任何类型的矩阵并返回相应的结果(如果其中一个操作数是矩形的,结果可以降级为典型的矩形矩阵) 。关于继承和操作符重载的OOP设计问题
我已经想到了2个可能的想法,这两者都是凌乱:
(1)一种IMatrix接口,这将列出所有需要为每种类型的矩阵的要实现的方法,例如,转置,逆等等,对于每种类型的矩阵来说,其有效实现是不同的。这里有两个问题:(a)操作符重载是静态方法,因此不能在接口中列出,甚至不能在实现接口的基类中列出。运算符重载必须分别写在每个类中,并且我不可能实现C = A + B类型的操作(如上所述),而不会在客户端代码中进行凌乱的类型检查和投射,我真的很想避免。 (b)中我不能有两个操作数作为接口时我定义操作符重载:即我不能执行以下操作中,比如,对角矩阵类:
public override IMatrix operator +(IMAtrix lhsMatrix, IMatrix rhsMatrix)
{ ... }
(2)可具有存储在矩阵型变量一个矩阵类在课堂上(可能是Enum)。根据类型,我们可以实现数据结构和算法。操作员超载可以无缝工作。这里存在一个问题:(a)在启动特定算法之前,该类将会有巨大的可能的开关语法来检查矩阵类型。对于每个二元运算符,我必须有n^2个例子,n是我想要实现的矩阵类型的数量。也可能是维修的噩梦。
看起来,没有操作员超载的细节,我可以使用Factory pattern或Visitor pattern,但不适用于op过载。解决这个问题最好的办法是什么?这里
- 一个related thread:
资源我迄今发现的。
- Explanation of a similar problem面向另一个OS C#数字封装的开发者。
编辑:
2011年4月25日:增加更多的资源,到目前为止,我还发现了这个问题。
有一些现有的数学库,你可以使用,或采取的想法:http://stackoverflow.com/questions/2336701/recommendation-for-c-matrix-library – 2011-02-16 17:35:14
@Merlyn:我曾考虑过,但有政策问题,所以我将不得不开发自己的。 (还是)感谢你的建议。 – 2011-02-16 18:50:29