【发布时间】:2021-09-27 14:05:38
【问题描述】:
考虑以下代码,它定义了一个abstract 类型foo 和一个deferred 过程sub,以及一个扩展foo 的类型foo2:
MODULE m
TYPE, ABSTRACT:: foo
CONTAINS
PROCEDURE(sub_int), DEFERRED:: sub
END TYPE
INTERFACE
SUBROUTINE sub_int(THIS, x)
IMPORT:: foo
CLASS(foo), INTENT(IN):: THIS
DOUBLE PRECISION, INTENT(INOUT):: x
END SUBROUTINE
END INTERFACE
TYPE, EXTENDS(foo):: foo2
CONTAINS
PROCEDURE:: sub
END TYPE
INTERFACE
MODULE SUBROUTINE sub(THIS, x)
CLASS(foo2), INTENT(IN):: THIS
DOUBLE PRECISION, INTENT(INOUT):: x
END SUBROUTINE
END INTERFACE
END MODULE
SUBMODULE (m) s
CONTAINS
MODULE PROCEDURE sub
x= x**2
END PROCEDURE
END SUBMODULE
有没有办法避免写第二个interface?
我知道将sub 声明为module procedure 是必需的(否则需要在module 中完成实现,而不是在submodule 中完成),但这是唯一的怎么办?
换句话说,是否可以在不重写整个接口的情况下为foo2 实现过程sub?
【问题讨论】:
-
它不仅仅是重写。一旦你有
class(foo),然后是class(foo2)。一旦接口块是抽象的,以后就不是了。 -
在我的例子中 MODULE a 中的接口块不是
ABSTRACT。另外,我不确定CLASS(foo2)是否真的向CLASS(foo)添加任何内容...任何扩展foo的类型都将属于CLASS(foo),因此扩展类型中的覆盖过程将需要foo类型参数.如果我错了,请纠正我。无论如何,您知道这是否是实现我在示例中描述的唯一方法吗? -
对不起,您的
sub_int接口块确实不是抽象的,但实际上应该是。但是subroutine和module subroutine之间仍然存在区别。你不只是复制同样的东西。 -
我实际上并没有故意使用抽象接口,以表明在我看来,至少有一些信息(过程的参数)是重复的,并且代码允许这样做。我在我的实际代码中使用抽象接口,用于延迟类型绑定过程,并且我同意它们应该用于此目的。但是,我只是想知道这是否是唯一的方法,或者是否有其他方法可以让我“节省”一些代码行。
-
我不相信目前可以做你想做的事。有proposals 将这些东西添加到未来的 Fortran 标准中。
标签: fortran