none
[F#] クラスにプライベートメンバを定義する事はできないのか RRS feed

  • 質問

  • F# でクラスを作った時、プライベートメンバは定義できないのでしょうか。

    例えば次のようなクラスを作りました。

    type Hoge () =  
      let a = 1 
     
      member private this.A  
        with get () = a  
     
      static member ( + ) (h1 : Hoge, h2 : Hoge) =  
        ... 適当な計算 --- 


    このときプロパティ A へのアクセスを、このクラス Hoge のユーザからはできず、かつ、静的メンバ ( + ) からはできるようにしたいです。

    しかし上記の記述だと、このクラス Hoge のユーザからも何故かアクセスできてしまいます (コンパイルエラーにならない)。

    なんとか意図したアクセス制限をかける事はできないでしょうか。

    ちなみに A はプロパティである必要は特にありません。本質的には単に let a で宣言した a へのアクセスを制限したいだけです。
    2009年3月15日 8:08

回答

すべての返信

  • よく調べたところ、 シグネチャファイル (*.fsi) を作れば公開したいものと公開したくないものを分けられることは分かりましたが、それでは何故 *.fs ファイル内で定義するクラスの記述には private や public といった記述が可能なのでしょうか。
    2009年3月15日 14:04
  • private を付ける位置が違います。
      member this.A
        with private get () = a

    2009年4月30日 13:52
  • get と set のそれぞれに対して個別にアクセス指定子を付けるんですね。納得しました。

    でも、member の直後に付けても文法エラーとも警告も出ないのは何とも・・・

    ありがとうございました。
    2009年4月30日 14:20
  • バグだったのか単に仕様変更なのか、VS 2010 Beta 1 の F# では、

    member private this.A
        with get () = a

    でもきちんと private になるようですね。
    2009年5月24日 13:41
  • 最初の記述方法でもちゃんと proivate になる事をこちらでも確認できました。
    2009年5月30日 2:17