我有以下代码:
Module Hello
Implicit None
Type, Public :: TestOne
Private
Integer :: One, Two, Three
contains
Procedure, Pass, Public :: Set => SetSub
End type TestOne
Private :: SetSub
Interface Assignment(=)
Module Procedure SubgetValue
End Interface Assignment(=)
contains
Subroutine SetSub(this)
Implicit none
Class(TestOne), Intent(InOut) :: this
this%one=1
this%two=2
this%three=3
End Subroutine SetSub
Subroutine SubGetValue(ISOut,TSIn)
Implicit None
Integer, Intent(Out) :: ISOut
Class(TestOne), Intent(In) :: TSIn
ISOut=TSIn%one
End Subroutine SubGetValue
End Module Hello
Program Test
use Hello
Implicit None
Type(TestOne) :: TSTest
Integer :: b
call TSTest%Set()
b=TSTest
write(*,*) b
End Program Test
在这个版本中,我只能通过“=”访问“TSTest%One”。 问题是我如何创建一个接口分配,以便我可以访问“TSTest%one”,“TSTest%two”或“TSTest%three”。如果“一个”,“两个”和“三个”不是私人的,那将是微不足道的。但是,目标是将它们保密,并通过接口分配访问它们。访问“Two”或“Three”的任何其他模块过程都将具有相同的伪参数,从而导致编译时错误。
然而,解决该问题的另一种方法是“setter”/“getter”例程,但我在网上的某处读过,通过赋值访问varialbe比通过“getter”例程快得多。
任何建议。
由于
答案 0 :(得分:4)
您定义的赋值例程与“getter”具有相同的开销 - 因为它就是它。
如果(何时)编译器的过程间优化达到了划痕,则不应该有任何额外的开销,特别是在TSTest对象不是多态的情况下。
在您编辑之前......
除了通过混合类型赋值提取任何明显的单一候选者之外,我首选的方法是使用单独的绑定来访问每个组件。
TYPE, PUBLIC :: TestOne
PRIVATE
INTEGER :: One, Two, Three
CONTAINS
PROCEDURE :: GetOne
PROCEDURE :: GetTwo
PROCEDURE :: GetThree
...
FUNCTION GetOne(this)
CLASS(TestOne), INTENT(IN) :: this
INTEGER :: GetOne
GetOne = this%One
END FUNCTION GetOne
...
b = TSTTest%GetTwo()
如果我感觉很有创意,我也可以为这种类型的一元“访问”运算符添加一些泛型类型绑定:
TYPE, PUBLIC :: TestOne
PRIVATE
INTEGER :: One, Two, Three
CONTAINS
PROCEDURE :: GetOne
...
GENERIC :: OPERATOR(.TheOneOutOf.) => GetOne
...
b = .TheOneOutOf. TSTTest
虽然有时候这种创造力让我对我的编译器供应商的支持渠道过于熟悉。
(考虑使定义的赋值类型绑定。)