2011-02-16 73 views
7

对于一个数学包,我试图为不同类型的矩阵设置类,如典型的矩形矩阵,三角矩阵,对角矩阵等。原因很自然地节省了高效的存储空间,高效的算法实现特殊矩阵。但是我仍然希望具有超载运算符的灵活性,其中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 patternVisitor pattern,但不适用于op过载。解决这个问题最好的办法是什么?这里

  1. 一个related thread

    资源我迄今发现的。

  2. Explanation of a similar problem面向另一个OS C#数字封装的开发者。

编辑:

2011年4月25日:增加更多的资源,到目前为止,我还发现了这个问题。

+0

有一些现有的数学库,你可以使用,或采取的想法:http://stackoverflow.com/questions/2336701/recommendation-for-c-matrix-library – 2011-02-16 17:35:14

+0

@Merlyn:我曾考虑过,但有政策问题,所以我将不得不开发自己的。 (还是)感谢你的建议。 – 2011-02-16 18:50:29

回答

7

如果这是我的项目,我会选择#1的变体:定义一个抽象Matrix类,它由更具体的类型继承,如TriangularMatrix。这将允许您创建运算符(即使所述运算符只是抛出NotImplementedException),然后您可以在派生类中重写。它也将允许您将任何矩阵作为矩阵处理,并具有该共同的一组功能。

您唯一会失去的是编译器会检查您是否实际覆盖了方法和运算符;由于运营商是静态的,因此不能将其抽象化。如果希望,可以通过使基类中的运算符调用等效的命名方法(例如,+会调用Add方法)来在基类中抽象,从而强制子类实现它。数学问题:可以将三角矩阵添加到矩形矩阵,还是两个加数必须在类型和/或维数上匹配?如果是前者,考虑在基类的Matrix类中实现操作符,并让该操作符实现一个策略模式,调用可以对每个类型组合执行实际操作的内部类。如果是后者,只需重写该类型矩阵的有效运算符的基类实现即可。