Fortran Coder

查看: 8701|回复: 6
打印 上一主题 下一主题

[派生类型] 球坐标和直角坐标能不能继承于同一个父类的问题

[复制链接]

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2019-1-13 16:31:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lookbook 于 2019-1-13 21:08 编辑

2D球坐标(r,phi)
2D直角坐标(x,y)
-----------------------
3D球坐标(r,theta,phi)
3D直角坐标(x,y,z)
-----------------------


球坐标和直角坐标只不过是描述同一个事物的不同描述方法,有一些物理量是不会随坐标变换和变化的,比如说长度,
那么是否可以使得:2D球坐标2D直角坐标,共同继承于一个相同的父类?

另外:
3D球坐标继承于2D球坐标
3D直角坐标继承于2D直角坐标

这里遇到一个 “=” 号的问题,
2D球=3D球,则x,y被赋值,
反之,x,y被赋值但z等于0,同理直角坐标。

但这之后,以下思路会出现问题:
如何再设计一个“=”,让 球坐标=直角坐标,或者 直角坐标=球坐标时,
直接进行转化。




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

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
沙发
发表于 2019-1-13 21:11:25 | 只看该作者
[Fortran] 纯文本查看 复制代码
module Point_m
  implicit none
  type,abstract:: Point
  end type
end module
module Point2D_m
use Point_m
  implicit none
  type,extends(Point):: Point2D
    real x, y
  end type
end module
module Point3D_m
use Point2D_m
  implicit none
  type,extends(Point2D):: Point3D
    real z
  end type
end module  
module Point2D_sph_m
use Point_m
  implicit none
  type,extends(Point):: Point2D_sph
    real r, phi
  end type
end module
module Point3D_sph_m
use Point2D_sph_m
use Point3D_m
  implicit none
  type,extends(Point2D_sph):: Point3D_sph
    real theta
  contains
  procedure XYZ2Sph, sph
  generic:: assignment(=) => XYZ2Sph, sph
  end type
  contains
  subroutine XYZ2Sph(this,other)
    implicit none
    class(Point3D_sph),intent(inout) :: this
    class(Point2D),intent(in) :: other
    select type(other)
    class is(Point2D)
      this%r = 1
      this%phi = 2
      this%theta = 0
    class is(Point3D)
      this%r = 1
      this%phi = 2
      this%theta = 3
    end select
  end subroutine XYZ2Sph

  subroutine Sph(this,other)
    implicit none
    class(Point3D_sph),intent(inout) :: this
    class(Point2D_sph),intent(in) :: other
    select type(other)
    class is(Point2D_sph)
      this%r = 5
      this%phi = 6
      this%theta = 0
    class is(Point3D_sph)
      this%r = 5
      this%phi = 6
      this%theta = 7
    end select
  end subroutine sph
  end module  
  
  program test
  use Point3D_m
  use Point3D_sph_m
  type(point2d) a
  type(point3d) b
  type(point2d_sph) c
  type(point3d_sph) d
  d = a
  print*,d
  d = b
  print*,d
  d = c
  print*,d
  d = d
  print*,d
  pause
  end

  
  

QQ截图20190113211020.png (23.29 KB, 下载次数: 314)

QQ截图20190113211020.png

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
板凳
发表于 2019-1-14 10:11:32 | 只看该作者
这些都可以做,但是这个父类设计没啥意思啊

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
地板
 楼主| 发表于 2019-1-15 13:47:49 | 只看该作者
liudy02 发表于 2019-1-14 10:11
这些都可以做,但是这个父类设计没啥意思啊

单独实现:
情况1:
2d直角=3d直角 & 3d直角=2d直角
2d球  =3d球 & 3d球  =2d球



情况2:
球=直角
直角=球

1和2各自实现都可以,但一齐实现对我而言有点难度。
大兄弟怎么做到的?

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
5#
发表于 2019-1-15 15:00:31 | 只看该作者
lookbook 发表于 2019-1-15 13:47
单独实现:
情况1:
2d直角=3d直角 & 3d直角=2d直角

没明白你的难处在哪里?既然都可以实现赋值,为什么会有问题
另外其实也不是很明白你这这么奇怪的需求是从哪里来的……

79

帖子

17

主题

0

精华

专家

齊天大聖

F 币
433 元
贡献
266 点
6#
 楼主| 发表于 2019-1-15 23:23:50 | 只看该作者
liudy02 发表于 2019-1-15 15:00
没明白你的难处在哪里?既然都可以实现赋值,为什么会有问题
另外其实也不是很明白你这这么奇怪的需求是 ...

如果同时assignment(=)=> balbalbal....

那这个等号的重载将会遇到问题。

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
7#
发表于 2019-1-16 10:03:35 | 只看该作者
lookbook 发表于 2019-1-15 23:23
如果同时assignment(=)=> balbalbal....

那这个等号的重载将会遇到问题。

每一个等号重载只在被赋值的(子)类中定义和实现
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

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

Powered by Tencent X3.4

© 2013-2024 Tencent

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