在Fortran中,在扩展定义中,如何将公共过程设置为私有过程?

在Fortran中,在扩展定义中,如何将公共过程设置为私有过程?,fortran,private,procedure,public,Fortran,Private,Procedure,Public,假设我首先定义了一个类型a,其中定义了一个公共过程f,也可以绑定到a。在另一个模块中,我将此类型扩展到B。但是,当我使用类型B时,我不希望f被暴露。 顺便说一下,我不想使用submod技术 补充: 假设类型(A)已定义: module mA type::A ... contains procedure::f endtype endmodule 在另一个模块B中,我们将A扩展为: module mB use mA type,extends(A)::B ... endtype end

假设我首先定义了一个类型a,其中定义了一个公共过程f,也可以绑定到a。在另一个模块中,我将此类型扩展到B。但是,当我使用类型B时,我不希望f被暴露。 顺便说一下,我不想使用submod技术

补充:

假设类型(A)已定义:

module mA 
type::A
 ...
 contains 
 procedure::f
endtype
endmodule
在另一个模块B中,我们将A扩展为:

module mB 
use mA
type,extends(A)::B
 ...
endtype
endmodule
在本模块中,f仍可使用。然而,接下来,在模块mC中,我将使用(声明)


我希望“callob%f()”是非法的。或者说,当我扩展一个类时,我想禁用一些函数。

很难理解您的描述,但如果我理解正确,这是不可能的

假设您有一个变量
类(a)::o
。你可以打电话

call o%f()

class(A)
是多态的,可以是
A
的任何扩展类型,因此其动态类型可以是
type(B)
。因此
B
必须提供可公开访问的过程
f
,以与家长保持兼容。

请向我们展示一个示例代码。请一直这样做。代码说明总是比冗长的描述好。一个可能的解决方法可能是在子类的“f”方法中放置“stop”语句?另一种解决方法可能是使用组合而不是继承,这样Ob%f()就不会被构造看到。
call o%f()