Fortran Coder

查看: 7601|回复: 7
打印 上一主题 下一主题

[面向对象] 抽象类中的过程

[复制链接]

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2018-11-22 14:40:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问大佬,抽象类里面为什么会有deferred的过程,有了这个属性的过程在子类里还不能随意重载。
那为什么不干脆不要了,子类里面想怎么重载怎么重载


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1643 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2018-11-22 17:20:43 | 只看该作者
定义了一个deferred的过程之后,父类可以调用这个过程。这样形成统一的接口。
其他使用 class(父类) 为参数的过程,也可以调用这个过程,而不需要判断对象属于哪个子类。(因为每个子类都有一个相同接口的函数)

给你一个例子

[Fortran] 纯文本查看 复制代码
Module Abst  Implicit None 
  Type , abstract , public :: T_People
    character(len=30) :: name
  contains
    Procedure(itf_intro), deferred :: introduction
    Procedure :: whoami
  End Type T_People
  interface
    Subroutine itf_intro(this)
      import
      class(T_People):: this
    End Subroutine itf_intro
  end interface

contains

  Subroutine whoami( this )
    class(T_People) :: this
    write(*,*) "Who am I ?"
    call this%introduction()
  End Subroutine whoami
End Module Abst

Module People
  use Abst
  Implicit None
  Type , extends(T_People), public :: T_Chinese    
  contains
    Procedure :: introduction => intro_chinese
  End Type T_Chinese
  Type , extends(T_People), public :: T_English
  contains
    Procedure :: introduction => intro_english
  End Type T_English

contains
  Subroutine intro_chinese(this)
    class(T_Chinese):: this
    write(*,*) "我的名字叫:" , this%name
  End Subroutine intro_chinese
  Subroutine intro_english(this)
    class(T_English):: this
    write(*,*) "My name is:" , this%name
  End Subroutine intro_english
End Module People

Program Main
  use People
  Implicit None
  type(T_Chinese) :: xiaoming = T_Chinese("小明")
  type(T_English) :: John = T_English("John")
  call xiaoming%introduction()
  call some(xiaoming)
  call some(John)
contains

  Subroutine some(someone)
    class(T_People) :: someone
    call someone%whoami()
  End Subroutine some
End Program Main

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
板凳
 楼主| 发表于 2018-11-22 20:24:37 | 只看该作者
fcode 发表于 2018-11-22 17:20
定义了一个deferred的过程之后,父类可以调用这个过程。这样形成统一的接口。
其他使用 class(父类) 为参数 ...

可不可以理解为就是为了使得父类和一众子类的过程接口全统一,才使用的这个deferred关键字。
如果自己在类书写的时候,使用的是重载的方式,但是接口是统一的话,就和有这个deferred属性的过程一样了?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1643 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2018-11-22 21:00:34 | 只看该作者
多试试,朋友。

deferred 是一个语法规范,并没有规定“什么情况下才能用”,更没有“只有.... 才使用”这种说法。

每个人都有自己的需求,我并没有那么广袤的了解过所有的需求,也很少考虑“在几种情况下,才会使用”这类问题。

147

帖子

42

主题

1

精华

宗师

F 币
1297 元
贡献
630 点
5#
发表于 2018-11-22 22:19:05 | 只看该作者
顶层框架   预留通用接口

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
6#
发表于 2018-11-24 14:16:38 | 只看该作者
fcode 发表于 2018-11-22 17:20
定义了一个deferred的过程之后,父类可以调用这个过程。这样形成统一的接口。
其他使用 class(父类) 为参数 ...

我曾经也想定义抽象类,结果怎么都不能成功
对比了版主您的例子,发现您在抽象方法的接口这里加了个import语句
想问下是不是因为这个语句,这个语句是干啥用的……

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
7#
发表于 2018-11-26 08:28:11 | 只看该作者
为了让接口 itf_intro 认识结构体 T_People

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
8#
发表于 2018-11-28 08:41:42 | 只看该作者
vvt 发表于 2018-11-26 08:28
为了让接口 itf_intro 认识结构体 T_People

原来如此,非常感谢
没在教科书上找到这个语句,一直不识……
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-28 02:11

Powered by Tencent X3.4

© 2013-2024 Tencent

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