ジェネリックインターフェイスと演算子のオーバーロード-ジェネリックインターフェイスブロックからのプロシージャをモジュール内でプライベートに設定する方法は?

ハリー・カストルプ

私のIDEは次のとおりです:Code :: Blocks 20.03(MinGW 9.2.0)

これは私のコードです:

module mod_kompleks

  use, intrinsic :: iso_c_binding, only : rp => c_double

  implicit none

  type, public :: kom_bro

    real(rp), private :: rea
    real(rp), private :: img

    contains

      procedure, pass(kdt), private :: kom_bro_ini
      procedure, pass(kdt),  public :: uzm_rea => uzm_pod_rea
      procedure, pass(kdt),  public :: uzm_img => uzm_pod_img
      procedure, pass(kdt), private :: kom_bro_sab

      generic, public :: operator(+) => kom_bro_sab

  end type kom_bro

  interface kom_bro

    module procedure kom_bro_kon

  end interface kom_bro

  private :: kom_bro_kon

contains

  function kom_bro_kon( bro_rea, bro_img ) result( bro )

    real(rp), intent(in) :: bro_rea
    real(rp), intent(in) :: bro_img
    type(kom_bro)        :: bro

    call bro%kom_bro_ini(bro_rea, bro_img)

  end function kom_bro_kon

  subroutine kom_bro_ini(kdt, dio_rea, dio_img)

    class(kom_bro), intent(out) :: kdt
     real(rp),      intent(in)  :: dio_rea
     real(rp),      intent(in)  :: dio_img

     kdt%rea = dio_rea
     kdt%img = dio_img

  end subroutine kom_bro_ini

  function uzm_pod_rea( kdt ) result( rez )

    class(kom_bro), intent(in) :: kdt
     real(rp)                  :: rez

     rez = kdt%rea

  end function uzm_pod_rea

  function uzm_pod_img( kdt ) result( rez )

    class(kom_bro), intent(in) :: kdt
     real(rp)                  :: rez

     rez = kdt%img

  end function uzm_pod_img

  function kom_bro_sab( kdt, bro ) result( rez )

    class(kom_bro), intent(in) :: kdt
    class(kom_bro), intent(in) :: bro
     type(kom_bro)             :: rez

     rez%rea = kdt%rea + bro%rea
     rez%img = kdt%img + bro%img

  end function kom_bro_sab

end module mod_kompleks

program kompleksni_broj

  use, non_intrinsic :: mod_kompleks

  implicit none

  type(kom_bro) :: broj_01, broj_02, broj_03

  broj_01 = kom_bro(1.1_rp,2.2_rp)

  print '(1x,f4.2,1x,"j",1xf4.2)', broj_01%uzm_rea(), broj_01%uzm_img()

  broj_02 = kom_bro(3.3_rp,4.4_rp)

  print '(1x,f4.2,1x,"j",1xf4.2)', broj_02%uzm_rea(), broj_02%uzm_img()

  broj_03 = broj_01 + broj_02

  print '(1x,f4.2,1x,"j",1xf4.2)', broj_03%uzm_rea(), broj_03%uzm_img()

end program kompleksni_broj

私の意図はkom_bro_sabmod_kompleksモジュール外のプロシージャへのアクセスを無効にすることです。メインプログラムの実数部と虚数部の値を使用して複素数を作成する場合は、komという単語を入力した後、手順を選択する機会があります。kon_broもちろん、これは必要ですが、その関数の横に表示されます。手順を選択する機会kom_bro_sabどうすればこれを防ぐことができますか(プロシージャkom_bro_sabと演算子のみを表示したい+)?タイプバインドされたプロシージャがプライベートであったとしても、取得したもののスクリーンショットを追加します。kom_bro_sab

フランチェスカラス

オーバーロードoperator(+)が機能するために

broj_03 = broj_01 + broj_02

考慮すべき3つの異なる側面があります。

  • モジュール手順 kom_bro_sab
  • バインディング名を持つ特定のタイプバインドプロシージャ kom_bro_sab
  • ジェネリック型にバインドされたインターフェイス operator(+)

Each of these has its own accessibility, and is a distinct thing.

Look at the statement we have. In

broj_03 = broj_01 + broj_02

we can see that when we consider the generic operator(+) we have left-hand side class(kom_bro) and right-hand side class(kom_bro): we have a match to the specific type-bound procedure kom_bro_sab. We can make this assessment outside the module because this generic interface is public. This resolution does not need the specific type-bound procedure to be public.

Assuming the binding name is accessible, this previous statement can be written as a reference to a specific type-bound procedure looking like

broj_03 = broj_01%kom_bro_sab(broj_02)

which finally, assuming the module procedure is accessible, looks like

broj_03 = kom_bro_sab(broj_01, broj_02)

We can independently control access of each of these things.

質問のコードでは、特定のバインディングがkom_bro_sabプライベートになっていますが、モジュールkom_bro_sabのデフォルトのアクセス可能性がパブリックであるため、モジュールプロシージャはパブリックです。

ジャックの答えは、デフォルトのアクセシビリティをプライベートにする方法、またはデフォルトのアクセシビリティをパブリックにしてモジュールプロシージャをプライベートにする方法を示しています。特定の汎用バインディングへの必要なアクセスをすでに指定しています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ