我在 Fortran 2003 中编写了一些代码,这些代码用稀疏矩阵做了很多线性代数。我正在尝试利用新标准的一些更抽象的特性,这样我就有了更简单的程序,而没有太多重复的代码。
我有一个程序solver
它包含一个矩阵、一些向量、所使用的迭代方法的容差等。我将一个指针传递给一个名为 matvec
的过程对它; matvec
是我们用于矩阵向量乘法的子程序。
问题是,有时 matvec
是一个接受额外参数的过程 colorlist, color1, color2
高于通常发送到此程序的那些。我可以想到几种处理方法。
第一个想法:定义两个不同的抽象接口(interface)matvec1
, matvec2
和两个不同的求解器。这可行,但这意味着复制一些代码,这正是我试图避免的。
另一个想法:保持相同的抽象接口(interface)matvec
, 并制作额外的参数 colorlist
, color1
, color2
选修的。这意味着在每个 matvec 例程中使它们成为可选的——即使是那些它们不是真正可选的,以及它们甚至根本不使用的例程。如果我这样做,我肯定会下 hell 的。
我能想到很多其他不是最佳的解决方案。我想对此提出一些意见——我确信有一些优雅的方法可以做到这一点,我只是不确定它是什么。
最佳答案
问题实际上是,每次调用过程时是否必须传递附加参数(因为它们在两次调用之间发生变化),或者它们可以在某个时候初始化,然后在函数中使用。在后一种情况下,您可以创建一个具有抽象接口(interface)的类,它定义了您的子例程 matvec
与基本论点。然后,您可以使用更专业的类扩展该类,这些类可以包含所需的其他选项。他们仍然必须定义相同的 matvec
接口(interface)作为父类(具有相同的参数列表),但是当它们的matvec
时,它们可以使用存储在其中的附加值。程序被调用。
你找到一个详细的例子in this answer对于类似的情况(查找显示 module rechercheRacine
的第二个示例)。
关于oop - fortran 2003 中的运行时多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15264667/