Fortran Coder

查看: 6974|回复: 6

[面向对象] abstract中的一个问题

[复制链接]

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
发表于 2018-11-30 14:45:36 | 显示全部楼层 |阅读模式
本帖最后由 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
第二种就是书上的

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


79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
 楼主| 发表于 2018-11-30 14:49:39 | 显示全部楼层
额,这蛋疼的编辑格式。。。大佬们将就看看吧

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
发表于 2018-11-30 16:31:13 | 显示全部楼层
按照上次从版主石头那里学来的知识
似乎应该在每一个抽象接口里边定义变量之前加入import语句啊
如果没有这个语句应该会报在抽象接口中用的派生类型没有定义
你这个写法确信能用?

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
 楼主| 发表于 2018-11-30 20:42:38 | 显示全部楼层
本帖最后由 lookbook 于 2018-11-30 20:44 编辑
liudy02 发表于 2018-11-30 16:31
按照上次从版主石头那里学来的知识
似乎应该在每一个抽象接口里边定义变量之前加入import语句啊
如果没有这 ...

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

这样也是可以的,帖子也更新了,感谢

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
发表于 2018-12-1 09:41:53 | 显示全部楼层
lookbook 发表于 2018-11-30 20:42
经你提醒,我看了下,确实有不妥的地方。
我和版主的方法不太一样,是:
interface

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

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
 楼主| 发表于 2018-12-1 15:52:32 | 显示全部楼层
liudy02 发表于 2018-12-1 09:41
其实还有个问题,既然你是定义abstract类的话
应该还是想帮定有抽象过程的吧,否则似乎也没太大必要定义 ...

小姐姐可以啊,发现了这么多问题,
确实少了deferred,还有没有其他的毛病?
十分感谢

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
发表于 2018-12-1 16:48:21 | 显示全部楼层
lookbook 发表于 2018-12-1 15:52
小姐姐可以啊,发现了这么多问题,
确实少了deferred,还有没有其他的毛病?
十分感谢 ...

小姐姐个毛线啊,我是男的,那个头像我从来没选过,鬼知道为什么是个那个……
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-3-29 00:35

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表