アクセス修飾子
F#には以下の3つのアクセス修飾子があります。クラスなどのtypeで宣言されるオブジェクト、メソッド、関数、プロパティ、valで宣言されるフィールドなどに使用できます。アクセス修飾子が指定されていない場合には、type内のletバインドはデフォルトprivateですが、それ以外はpublicになります。
| 修飾子 | 概要 |
| public | どこからでもアクセス可能 |
| internal | 同じアセンブリ内からのみアクセス可能 |
| private | 同一モジュール内もしくは、同一のtypeキーワードで宣言されている内部の要素からのみアクセス可能 |
C#にあるprotectedはF#にありません。しかし、protectedをサポートする言語で宣言されたクラスやその他の型を使えばprotectedの要素にアクセスすることができます。オーバーライドされたprotectedなメソッドもクラスとその派生クラスからのみアクセスできます。
メンバー
メンバーとはクラスを構成する、memberキーワードで宣言される要素(メソッド、プロパティ、イベント)とプライマリ以外のコンストラクタのことです。
メソッド
まず、メンバーの中で最も重要な機能、メソッドについて解説したいと思います。
メソッドは次のようにmemberキーワードを用いて作成します。
(1)メソッドの定義
=(イコール)の後ろに続くメソッド本体が長い場合は改行し、インデントをつけます。
[属性]
member [アクセス修飾子] [inline] セルフ識別子.メソッド名 パラメータ [: 戻り値の型]=
メソッド本体
クラスを定義する際に、「as セルフ識別子」で指定されたクラス内で有効なセルフ識別子とは別に、メソッド名の前にセルフ識別子を指定することで、メソッド内のみ有効なセルフ識別子を指定できます。
先ほど作成したクラスにシンプルなメソッドを追加してみます。メソッドの定義はいかなる場合にも、letとdo式の後になります。
//クラスの作成
type testClass1(a1 : int, b1 : int) as kore=
let a = a1 + b1
let mutable b = a1 * b1
let mutable c = "hello"
[<DefaultValue>] val mutable c : int
[<DefaultValue>] val mutable d : string
do printf "%d, %d" a b;
member this.testMethod3() =
printf "Data: %d %d %s" a b c ;;
//インスタンスの作成とメソッドの呼び出し
let testObj1 = new testClass1(10, 20) ;;
testObj1.testMethod3();;
▼
type testClass1 =
class
new : a1:int * b1:int -> testClass1
val mutable c: int
val mutable d: string
//testMethodはパラメータを受け取らず(つまりパラメータはUnit型)戻り値がunitである
member testMethod3 : unit -> unit
end
>
//プライマリコンストラクタによる処理
30, 200
val testObj1 : testClass1
//メソッドによる処理
> Data: 30 200 hello
val it : unit = ()
どんな型のパラメータが使用可能か制限するために、メンバー制約という制約が使用できます。メンバー制約を有効にするためには、inline修飾子をつける必要がありますが、メンバー制約についての詳細は次回移行の連載で解説します。
メソッドに適用できる属性としては、OverloadIDなどがありますが、これについても次回以降の連載にて属性を取り扱う際に解説したいと思います。
(2)スタティックメソッド
インスタンスを作成せずに直接クラスから呼び出すことができるメソッドをスタティックメソッドと言います(対して呼び出しにインスタンス作成が必要なメソッドをインスタンスメソッドと言います)。
[属性]
static member [アクセス修飾子] [inline] メソッド名 パラメータ [: 戻り値の型]=
メソッド本体
以下の例のように、インスタンスではなく、クラス経由でメソッドが呼べます。
type testClass =
class
static member testMethod a b = a + b
end;;
let a = testClass.testMethod 1 2;;
▼
type testClass =
class
static member testMethod : a:int -> b:int -> int
end
>//クラスから直接メソッドが呼び出せた
val a : int = 3
