Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在fortran中定义多态类方法? 在C++中,可以建立多态抽象接口方法 class parent { int i; single j; void set(int i_value)=0; void set(single j_value)=0; }; class child : parent { void set(int value) { i = value; } void set(single value) { j = value; } }; int main() { parent *p = new child(); p->set(1); // This sets the i member to 1 p->set(2.0); // This sets the j member to 2.0 }_Fortran - Fatal编程技术网

是否可以在fortran中定义多态类方法? 在C++中,可以建立多态抽象接口方法 class parent { int i; single j; void set(int i_value)=0; void set(single j_value)=0; }; class child : parent { void set(int value) { i = value; } void set(single value) { j = value; } }; int main() { parent *p = new child(); p->set(1); // This sets the i member to 1 p->set(2.0); // This sets the j member to 2.0 }

是否可以在fortran中定义多态类方法? 在C++中,可以建立多态抽象接口方法 class parent { int i; single j; void set(int i_value)=0; void set(single j_value)=0; }; class child : parent { void set(int value) { i = value; } void set(single value) { j = value; } }; int main() { parent *p = new child(); p->set(1); // This sets the i member to 1 p->set(2.0); // This sets the j member to 2.0 },fortran,Fortran,在本例中,我声明了一个将在子类中实现的纯虚拟接口方法集。根据参数的类型,将运行相应的方法 我正试图在Fortran 2003中设置同样的东西,但我不知道这是否可行。我想重载set方法,以便它选择正确的方法以减少所需的代码量。我试过了 MODULE test TYPE, ABSTRACT :: parent INTEGER :: i REAL :: j CONTAINS PROCEDURE(parent_set_i), DEFERRED :: set_i PROCE

在本例中,我声明了一个将在子类中实现的纯虚拟接口方法集。根据参数的类型,将运行相应的方法

我正试图在Fortran 2003中设置同样的东西,但我不知道这是否可行。我想重载set方法,以便它选择正确的方法以减少所需的代码量。我试过了

MODULE test

TYPE, ABSTRACT :: parent
   INTEGER :: i
   REAL    :: j
CONTAINS
   PROCEDURE(parent_set_i), DEFERRED :: set_i
   PROCEDURE(parent_set_r), DEFERRED :: set_r
   GENERIC                           :: set => set_i, set_r
END TYPE

INTERFACE
   SUBROUTINE parent_set_i(this, value)
      IMPORT
      CLASS (parent), INTENT(inout) :: this
      INTEGER, INTENT(in)          :: value
   END SUBROUTINE

   SUBROUTINE parent_set_r(this, value)
      IMPORT
      CLASS (parent), INTENT(inout) :: this
      REAL, INTENT(in)              :: value
   END SUBROUTINE
END INTERFACE

TYPE, EXTENDS(parent) :: child
CONTAINS
   PROCEDURE(child_set_i) :: set_i
   PROCEDURE(child_set_r) :: set_r
END TYPE

CONTAINS

SUBROUTINE child_set_i(this, value)
   CLASS (child), INTENT(inout) :: this
   INTEGER, INTENT(in)          :: value

   this%i = value

END SUBROUTINE

SUBROUTINE child_set_r(this, value)
   CLASS (child), INTENT(inout) :: this
   REAL, INTENT(in)             :: value

   this%j = value

END SUBROUTINE

END MODULE

PROGRAM example
   USE test

   CLASS (child), POINTER  :: c
   CLASS (parent), POINTER :: p
   ALLOCATE(c)
   p => c
   p%set(1)
   p%set(2.0)

END PROGRAM
但是,这会导致编译错误,说明:

          PROCEDURE(child_set_i) :: set_i
                               1
Error: PROCEDURE(interface) at (1) should be declared DEFERRED

这是可能的吗?或者我需要更明确地用类方法吗?< /P> < P>我不知道C++,这就是你想要做的吗?

ian-admin@agon ~/work/stack $ cat pai.f90
Module test

  Type, Abstract :: parent
     Integer :: i
     Real    :: j
   Contains
     Procedure(parent_set_i), Deferred :: set_i
     Procedure(parent_set_r), Deferred :: set_r
     Generic                           :: set => set_i, set_r
  End Type parent

  Interface
     Subroutine parent_set_i(this, Value)
       Import
       Class (parent), Intent(inout) :: this
       Integer, Intent(in)          :: Value
     End Subroutine parent_set_i

     Subroutine parent_set_r(this, Value)
       Import
       Class (parent), Intent(inout) :: this
       Real, Intent(in)              :: Value
     End Subroutine parent_set_r
  End Interface

  Type, Extends(parent) :: child
Contains
  Procedure :: set_i => child_set_i
  Procedure :: set_r => child_set_r
End Type

Contains

  Subroutine child_set_i(this, Value)
    Class (child), Intent(inout) :: this
    Integer, Intent(in)          :: Value

    this%i = Value

  End Subroutine child_set_i

  Subroutine child_set_r(this, Value)
    Class (child), Intent(inout) :: this
    Real, Intent(in)             :: Value

    this%j = Value

  End Subroutine child_set_r

End Module test

Program example
  Use test

  Class (child), Pointer  :: c
  Class (parent), Pointer :: p
  Allocate(c)
  p => c
  Call p%set(1)
  Call p%set(2.0)

End Program example
ian-admin@agon ~/work/stack $ gfortran -std=f2008 -Wall -Wextra -fcheck=all pai.f90 
ian-admin@agon ~/work/stack $ ./a.out
ian-admin@agon ~/work/stack $