我還沒有在Fortran中找到有關泛型的信息。具有任意類型值的節點類,Fortran 2003
我想創建一個節點類:
- 包含任意類的變量,「任何::值,」
- 其中可指定的類或者(a)在實例化或者(b)通過init子例程。
理想情況下,我想模仿的Java功能:
Node<Integer> n = new Node<Integer>();
這是可能在2003年的Fortran?或者,我將不得不爲每個可能具有「價值」的類創建一個節點派生類?
第一篇文章中提出的解決方案並不完全符合我的要求。試想一下:
program generics_test
implicit none
type node_int
integer :: x
end type node_int
type node
class(*), allocatable :: value
end type node
type(node) :: obj
allocate(node_int :: obj%value)
!This must be used:
select type (val => obj%value)
type is (node_int)
val%x = 1
class default
!throw en error
end select
end program generics_test
這說明了一個主要問題:需要select type
與分配的無限多態對象進行交互。舉個例子:
module node_class
type node
class(*), allocatable :: anything
contains
procedure, public :: init => init_sub
end type node
private :: init_sub
contains
subroutine init_sub(this, something)
class(node) :: this
somethingObj :: something ! <--- this assumes we know what soemthing is;
! generous, since my question doesn't assume that
allocate(this%anything, source=something)
end subroutine init_sub
end module node_class
看來,雖然你可能需要class(*), allocatable :: anything
和allocate(anythingObj, source=somethingObj)
某處type node
內,node
不能永遠治療anything
,就好像是一個somethingObj
除非anything
出現在select type... type is (somethingObj)
塊。因此,爲了模擬我寫過的select type
以上的Java代碼片段,每個對象都必須有一個case,它會遇到的。
你必須使用'select type'塊來處理a定位類型的無限多態。 –
你能編輯上面的程序來證明這一點嗎?更重要的是,這不需要你知道你正在檢查的類型嗎? –
是的,當然它需要它,但是如果你指定了某個東西,你必須知道它是什麼類型! –