例如定义一个派生类型是三维矢量
[Fortran] 纯文本查看 复制代码 TYPE :: vect
Real(8) ,Private :: x
Real(8) ,Private :: y
Real(8) ,Private :: z
End TYPE
然后希望定义矢量的数乘,并且希望可以用“*”号进行运算,
由于涉及的数据成员都是隐藏的,所以只能用绑定的方法实现
例如在派生类型定义改成:
[Fortran] 纯文本查看 复制代码 TYPE :: Vect
Real(8) ,Private :: x
Real(8) ,Private :: y
Real(8) ,Private :: z
Contains
Generic, Public :: operator (*) => ScalMul
Proceduce,Private :: ScalMul => VectMulScal_Fn, ScalMulVect_Fn
End TYPE
Private :: VectMulScal_Fn, ScalMulVect_Fn
然后再在模块的内部子程序列表里写出标量右乘矢量和标量左乘矢量的这两个函数实现
可是如果自定义算符要绑定类型的话,其实现方法必须是 PASS 类型的
也就导致二元算符“*”的左边必须是三元矢量的派生类型
像我刚才写的这段代码里,ScalMulVect_Fn(Scal,ThisVect)实际上根本就不被允许
可是实际矢量数乘运算时,很可能是实数在左,符号在右
所以实际上想实现的功能根本无法实现
另外,自定义算符也可以不绑定派生类型Vect
但是这样会导致其实现函数不能直接访问派生类型Vect的数据成员坐标吧?
这种情况怎么解决好呢?
我想到有两种解决办法,还请各位大神指教,也请大神有更好的办法教教我
第一种办法是不用绑定类型Vect,派生类型Vect的数据成员不设成Private,而是Protected
这样的坏处是数据成员并没有完全隐藏吧?似乎外界还是可以用Vect1%x,Vect2%y这种方法直接读数据
只是不能更改他们的值而已?这样感觉隐藏效果不佳意图没有完全实现
第二种办法也还还没办法绑定类型Vect,派生类型Vect的数据成员可以设成为Private
但是算符的实现函数ScalMulVect_Fn和VectMulScal_Fn中就不能直接引用Vect类型参量的数据成员了
只能用绑定的Get函数来读数据和用绑定的Set子程序来赋值
这个办法开起来似乎意图全都实现了,但是感觉平白多了好多函数引用,是不是会影响效率啊…… |