例如,我在type A
中有moduleA
的定义:
Module moduleA
implicit none
type A
private
integer::N
contains
...
procedure,pass::f=>f1
endtype
private::f1
contains
real function f1(self,x)
real::x(self%n)
end function
...
end Module
然后我发现我在其他模块中覆盖函数f
时遇到了麻烦,因为我无法获得N
的值。尽管我可以有一个方法来实现这一点,但似乎real :: x(self%get())
之类的东西在声明中是不可能的。我想保持"私人"的规则。在OPP中。那么我可以选择什么?
答案 0 :(得分:0)
你做不到。至少在你描述的方式。最好看一个覆盖的例子来提出其他选择。
private
属性在Fortran中的工作方式不同,因此您不应直接使用其他语言中使用OOP的规则private
表示不同的内容。
在Fortran中private
是关于本地模块的,在C ++中它是关于派生类的。这是非常不同的,当private
实际上意味着其他东西时,你不能在Fortran中使用private
的C ++(或Java等)规则。
要清楚,我认为你想要这种压倒一切:
real function f2(self,x)
class(B) :: self
real::x(self%get())
end function
你得到这些消息:
private.f90(15): error #8497: Illegal use of a procedure name in an expression, possibly a function call missing parenthesis. [GET]
real::x(self%get())
---------------------^
或
real::x(self%get())
1
Error: 'get' at (1) should be a FUNCTION
因此编译器不会接受声明中的类型绑定过程。他们会接受一个普通的程序。
这可以在gfortran中编译,但不能在英特尔Fortran中编译。但get()
必须是公开的,您可能不需要:
real function f1(self,x)
class(A) :: self
real::x(get(self))
end function
real function f2(self,x)
class(B) :: self
real::x(get(self))
end function
在ifort中我得到了
error #8383: The dummy arguments of an overriding and overridden binding that correspond by position must have the same characteristics, except for the type of the passed object dummy arguments.
这很奇怪。