运行时多态性在fortran 2003中

kor*_*rok 5 oop polymorphism fortran

我在Fortran 2003中编写了一些代码,它使用稀疏矩阵执行大量线性代数.我正在尝试利用新标准的一些更抽象的功能,所以我有更简单的程序,没有太多的重复代码.

我有一个过程solver,它接受一个矩阵,一些向量,使用的迭代方法的容差等.我传递一个指向一个调用matvec它的过程的指针; matvec是我们用于矩阵向量乘法的子程序.

问题是,有时候matvec这个过程会在colorlist, color1, color2发送到此过程的常规参数之上引入额外的参数.我可以想到几种处理这个问题的方法.

第一个想法:定义两个不同的抽象接口matvec1,matvec2和两个不同的解算器.这有效,但它意味着复制一些代码,这正是我想要避免的.

另一个想法:保持同样的抽象接口matvec,并进行额外的参数colorlist,color1,color2可选的.这意味着在每个matvec例程中都可以选择它们 - 甚至是那些它们不是真正可选的例程,以及它们甚至根本不用的例程.如果我这样做,我肯定会下地狱.

我可以想到许多其他不太理想的解决方案.我想对此有所了解 - 我确信有一些优雅的方法可以做到,我只是不确定它是什么.

Bál*_*adi 5

问题是,每次调用过程时是否必须传递附加参数(因为它们在两次调用之间发生变化),或者它们可以在某个时刻初始化,然后只在函数中使用.在后一种情况下,您可以使用抽象接口创建一个类,该接口matvec使用基本参数定义子例程.然后,您可以使用更专业的类扩展该类,这可以包含所需的其他选项.它们仍然必须定义与matvec父类相同的接口(具有相同的参数列表),但是在matvec调用它们的过程时,它们可以使用存储在其中的附加值.

您可以在此答案中找到类似案例的详细示例(查看第二个示例module rechercheRacine).