Fortran Coder

标题: abstract中的一个问题 [打印本页]

作者: lookbook    时间: 2018-11-30 14:45
标题: abstract中的一个问题
本帖最后由 lookbook 于 2018-12-1 15:54 编辑

父类如下:

...                                                                  |      ...
                                                                     |
type,abstract :: t_a                                         |      type,abstract :: t_a
   integer :: a                                                 |         integer:: a
contains                                                        |      contains
   procedure(fun1),pass(this),deferred :: fun1   |         procedure(fun1_mode),pass(this),deferred :: fun1
end type                                                        |      end type
                                                                    |
abstract interface                                           |     abstract interface
   module subroutine fun1(this)                        |        module subroutine fun1_mode(this)
   class(t_a)::this                                            |        class(t_a)::this
   ...                                                              |        ...
   end subroutine                                            |        end subroutine
end interface                                                 |     end interface
                                                                    |
private fun1                                                   |
end                                                              |      end  


子类:
use ...
type,extends(t_a)::t_b
real :: b
contains
procedure,pass(this) :: fun1
end type


contains

subroutine fun1(this)
class(t_b) :: this
...
end subroutine
...

------------------------------------------------------
这两种形式我都试过可以,第一种deferred的过程可以和接口名称一样,但必须加private
第二种就是书上的

其实我一直有个问题,过程名可以和接口名一致吗?
第一种方法会造成诸如扩展维护上的问题吗?



作者: lookbook    时间: 2018-11-30 14:49
额,这蛋疼的编辑格式。。。大佬们将就看看吧
作者: liudy02    时间: 2018-11-30 16:31
按照上次从版主石头那里学来的知识
似乎应该在每一个抽象接口里边定义变量之前加入import语句啊
如果没有这个语句应该会报在抽象接口中用的派生类型没有定义
你这个写法确信能用?
作者: lookbook    时间: 2018-11-30 20:42
本帖最后由 lookbook 于 2018-11-30 20:44 编辑
liudy02 发表于 2018-11-30 16:31
按照上次从版主石头那里学来的知识
似乎应该在每一个抽象接口里边定义变量之前加入import语句啊
如果没有这 ...

经你提醒,我看了下,确实有不妥的地方。
我和版主的方法不太一样,是:
interface
   module subroutine(this,...)
   implicit none
   class(balabala...)::this
   ....

这样也是可以的,帖子也更新了,感谢
作者: liudy02    时间: 2018-12-1 09:41
lookbook 发表于 2018-11-30 20:42
经你提醒,我看了下,确实有不妥的地方。
我和版主的方法不太一样,是:
interface

其实还有个问题,既然你是定义abstract类的话
应该还是想帮定有抽象过程的吧,否则似乎也没太大必要定义成抽象类
仅仅只是为了不让申明父类对象么,感觉这不是通常用法……
另外,看你写了抽象过程的接口,也不是啊
那么,是不是在定义类的时候,fun1的绑定申明的时候应该有deferred关键字吧
作者: lookbook    时间: 2018-12-1 15:52
liudy02 发表于 2018-12-1 09:41
其实还有个问题,既然你是定义abstract类的话
应该还是想帮定有抽象过程的吧,否则似乎也没太大必要定义 ...

小姐姐可以啊,发现了这么多问题,
确实少了deferred,还有没有其他的毛病?
十分感谢
作者: liudy02    时间: 2018-12-1 16:48
lookbook 发表于 2018-12-1 15:52
小姐姐可以啊,发现了这么多问题,
确实少了deferred,还有没有其他的毛病?
十分感谢 ...

小姐姐个毛线啊,我是男的,那个头像我从来没选过,鬼知道为什么是个那个……




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2