c# – 关于继承和运算符重载的OOP设计问题

c# – 关于继承和运算符重载的OOP设计问题,第1张

概述对于数学包,我正在尝试为不同类型的矩阵提供类,例如典型的矩形矩阵,三角矩阵,对角矩阵等.原因很自然地是节省了有效存储和特殊矩阵的高效算法实现.但是我仍然希望具有重载运算符的灵活性,其中C = A B将A和B作为任何类型的矩阵并返回相应的结果(如果其中一个 *** 作数是矩形的,则结果可以降级为典型的矩形矩阵). 我想到了两个可能的想法,这两个想法都很混乱: (1)IMatrix接口,它列出了需要为每种类型 对于数学包,我正在尝试为不同类型的矩阵提供类,例如典型的矩形矩阵,三角矩阵,对角矩阵等.原因很自然地是节省了有效存储和特殊矩阵的高效算法实现.但是我仍然希望具有重载运算符的灵活性,其中C = A B将A和B作为任何类型的矩阵并返回相应的结果(如果其中一个 *** 作数是矩形的,则结果可以降级为典型的矩形矩阵).

我想到了两个可能的想法,这两个想法都很混乱:

(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:到目前为止,我已经找到了有关此问题的更多资源.

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

你唯一会失去的是编译器检查你实际上是否覆盖了方法和运算符;由于运算符是静态的,因此不能使它们变得抽象.如果您愿意,可以通过使基类中的运算符简单地调用可以在基类中抽象的等效命名方法(例如,将调用Add方法)来解决此问题,从而强制子类实现它.

数学问题:可以将三角矩阵添加到矩形矩阵中,还是两个加数必须在类型和/或尺寸上匹配?如果是前者,请考虑在基类Matrix中实现运算符,并让该运算符实现策略模式,调用可以对每种类型组合执行实际 *** 作的内部类.如果是后者,只需覆盖该类型矩阵的有效运算符的基类实现.

总结

以上是内存溢出为你收集整理的c# – 关于继承和运算符重载的OOP设计问题全部内容,希望文章能够帮你解决c# – 关于继承和运算符重载的OOP设计问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1244891.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存