2017-05-29 6 views
1

他の言語では、静的メソッドは静的メンバーにアクセスでき、その可視性はクラススコープによって制限されます。 Fortranでは、静的メンバーはありません(私が間違っている場合は私を修正してください)。メソッド名はグローバルにアクセスできるので、異なるクラスに同じ名前の静的メソッドを2つ持つことさえできません。私は "ノパス"メソッドを "静的"と考えていますが、その用語が適用可能かどうかはわかりません。上記を踏まえて、単なるモジュール関数との違いはありません。プレーン関数に比べてnopass-methodsを使う利点はありますか?プロシージャnopassとfortranのプレーン関数

編集:

異なるクラスに同じ名前を持つ2つの静的メソッド持つことができないことの実例:

明らか
module test_mod 
    type type1 
    contains 
    procedure, nopass :: proc => proc1 
    end type 

    type type2 
    contains 
    procedure, nopass :: proc => proc2 
    end type 

contains 
    subroutine proc1() 
    print *, 'proc1' 
    end subroutine 

    subroutine proc2() 
    print *, 'proc2' 
    end subroutine 
end module 

を、私はちょうど今call proc()を言うことができない、また私は使用することができますコンパイラが適切な方法を選ぶのを助けるクラス名。

+0

あなたは何を意味するか、プロシージャ名と同じものではないこと、しかし、注意すべきです「異なるクラスに同じ名前の2つの静的メソッドを持つことさえできないのですか? – francescalus

+0

@francescalus私は自分の質問を更新しました – DartLenin

+2

どのような場合でも 'proc'を呼び出すことはできません。 ( 'type1(type1)t1'の場合)' call t1%proc' ... – francescalus

答えて

2

アクセシビリティを考慮してください:パブリック型バインドされたプロシージャは、型にアクセスできるときはいつでもアクセスできます。

use mod1, only : type1 
    use mod2, only : type2 

    type(type1) t1 
    type(type2) t2 

    call t1%proc 
    call t2%proc ! These aren't ambiguous 

end 

は、私たちが代わりにしたい手続上のあいまいさを避けるために:use <module>, only <...>

module mod1 
    type type1 
    contains 
    procedure, nopass :: proc 
    end type 

contains 

    subroutine proc 
    end subroutine 

end module 

module mod2 
    type type2 
    contains 
    procedure, nopass :: proc 
    end type 

contains 

    subroutine proc 
    end subroutine 

end module 

我々は、使用関連付けに名前を変更することなく、モジュールのプロシージャ名での競合を避けることができると同様に

module mod 
    private 
    type, public :: type1 
    contains 
    procedure, nopass :: proc 
    end type 

contains 

    subroutine proc 
    end subroutine 

end module 

    use mod 
    type(type1) t1 

    call t1%proc 
    call proc ! No, we can't call proc from mod1 

end 

、名前を変更する必要があります:

use mod1, proc1=>proc 
    use mod2, proc2=>proc 

    call proc1 
    call proc2 

end 

手続き参照の動的な選択もあります:

module mod 
    type type1 
    contains 
    procedure, nopass :: proc=>proc1 
    end type 

    type, extends(type1) :: type2 
    contains 
    procedure, nopass :: proc=>proc2 
    end type 

contains 

    subroutine proc1 
    end subroutine 

    subroutine proc2 
    end subroutine 

end module 

use mod 
class(type1), allocatable :: t 

t=type1() 
call t%proc ! proc1 

t=type2() 
call t%proc ! proc2 

end 

t1%procのようなバインディング名が

use mod 
type(type1) t1 
call sub(proc1) ! Where this is accessible 
call sub(t1%proc) ! We cannot do this 

contains 

subroutine sub(proc) 
    procedure() proc 
end subroutine 

end 
関連する問題