oop - Fortran 2003,选择类型以区分 'real' 和 'real array'

标签 oop polymorphism fortran

我的问题是,“可以使用 select type block 来区分 real::realInputreal::realArrayInput(:) ?”很清楚 select type 可以如何用于区分派(dispatch)生类型,但我不太清楚它如何(或是否)可以用于内部类型。

在Mad Libs表格中,下面的空格可以用来区分上面的输入吗:

select type (input)
    type is (real)
        print *, "I caught the realInput"
    type is (___________)
        print *, "I caught the realArrayInput"
end select

我发现一些相关的帖子并没有完全包含我所希望的答案:

Select Type Issues

Determining Variable Type

最佳答案

没有。 input 被声明为数组或标量,即使它是多态的(甚至是无限多态的)。

最近与 C TS(可能是 F201X 的一部分)的进一步互操作性引入了假设等级和 RANK 内在的概念,它们可以做你想做的。但是对于假定等级的对象可以做什么有很多限制。不管那个 SELECT TYPE 仍然只适用于类型。选择类型构造的语法根本不允许在类型保护语句中指定等级。

显然取决于您实际想要做什么(?)...除了其他人提到的通用接口(interface)之外,一种在当前 Fortran 中拥有可以是数组或标量的对象的方法(还有其他可能性)是使用作为公共(public)父类型扩展的派生类型包装器。然后,您可以使用声明为父类型的多态对象(或者您可以使用无限制的多态对象)来引用相关派生类型的对象。

TYPE :: parent
END TYPE parent

TYPE, EXTENDS(parent) :: scalar_wrapper
  REAL :: scalar_component
END TYPE scalar_wrapper

TYPE, EXTENDS(parent) :: array_wrapper
  REAL :: array_component(10)
END TYPE array_wrapper
...

SUBROUTINE what_am_i(object)
  ! Note that object is scalar, but that doesn't tell us 
  ! the rank of the components of the dynamic type of object.
  CLASS(parent), INTENT(IN) :: object
  !****
  SELECT TYPE (object)
  TYPE IS (scalar_wrapper)
    PRINT "('I am a scalar with value ',G0)",  &
        object%scalar_component
  TYPE IS (array_wrapper)
    PRINT "('I am an array with values ',*(G0,:,','))",  &
        object%array_component
  CLASS DEFAULT
    PRINT "('I am not sure what I am.')"
  END SELECT
END SUBROUTINE what_am_i

关于oop - Fortran 2003,选择类型以区分 'real' 和 'real array',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22315606/

相关文章:

php - 如何创建一次写入属性?

c# - 如何处理对象内部的列表对象?

java - 在 Java 语言层次结构中添加自定义树类

java - 将 jbutton 添加到 jtable 的更简单方法

inheritance - Swagger 2.0 中的抽象父类

c++ - 在双重继承的情况下如何处理非标准构造函数

macos - gfortran : fatal error: no input files compilation terminated

c++ - Boost.Python 和 std::shared_ptr 的多态行为

c++ - 在混合源代码中生成调用树或抽象语法树?

pointers - 指向包含可分配数组的派生类型的指针