oop - fortran 2003 中的运行时多态性

标签 oop polymorphism fortran

我在 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/

相关文章:

java - 这是某些类型的方法变量吗?

c++ - 多态结构声明

struct - Fortran - 可分配派生类型的可分配数组

pointers - nullify(pointer) 和 pointer => null() 的区别

loops - 不确定在 openmp 循环中应该共享或私有(private)什么

c++ - 更新类变量或从成员变量调用类函数会产生运行时错误

Java:如何将点值传递给折线?

java - 如何使用对象字符串来实例化对象

php - Laravel 多态嵌套关系显示无法解释的行为

java - 这段代码的输出是什么以及如何输出?