クラス宣言の概要
クラスについては、こちらで既に初歩的な紹介をしておりますので、まずはそちらを一読ください。
前回の内容では、クラスの基本的な宣言構文を学習するためにあえて省略した構文を紹介しました。今回は、もう少し詳細なクラスの宣言方法を紹介していきたいと思います。
// ------------------
// [ 構文 ]
// ------------------
type [access-modifier] type-name [type-params] [access-modifier] ( parameter-list ) [ as identifier ] = [ class ]
[ inherit base-type-name(base-constructor-args) ]
[ let-bindings ]
[ do-bindings ]
member-list
...
[ end ]
前回の内容であまり触れていない内容について、以下に補足情報を追記しておきます。
クラスのアクセス修飾子
クラスを宣言する際には、アクセス修飾子(= access-modifier)をオプションで指定することができます。デフォルトでは public となっています。アセンブリを越えてクラスを利用させたい場合には、明示的に 'public' と指定しなければなりません。
パラメータリストのアクセス修飾子
パラメータリスト(= access-modifier)にも、アクセス修飾子(= access-modifier)をオプションで指定することができます。デフォルトでは public となっています。privateを指定した場合、このパラメータリストを使ったインスタンス化を利用できるのはクラス内だけとなります。これはSingletonパターンの実現をしたい場合などに便利さを感じると思います。
サンプルでみるクラス宣言
以下は簡単な クラス宣言 の宣言方法サンプルになります。
上記は以前の内容で紹介したような、一般的なクラス宣言の方法になります。クラスのアクセシビリティがinternalで宣言されていることを除けば、特筆すべき点はありません。
では、パラメータリストがprivateの場合のサンプルを見てみましょう。
上記を自分の手元の開発環境にコピーしてみるとわかりますが、BaseClassのデフォルトコンストラクタは外部から利用できなくなっています。この性質を利用して、「流れるようなインターフェース」や「Singletonパターン」の実装に役立ててください。
自己識別子の定義
自己識別子は、現在のインスタンスを表す名前です。自己識別子は、C#でいうところの 'thisキーワード', VBでいうところの 'Meキーワード' に似ています。自己識別子をクラス定義全体のスコープにするか、個々のメソッドのみのスコープとするかに応じて、2つの異なる方法で自己識別子を定義定義できます。
クラス全体の自己識別子を定義する場合には as を利用します。
C#やVBなどとは違い、F#では任意の自己識別子を定義することができます。そのため、短い自己識別子を定義する人も多く存在します。ここで重要なことは、同一プロジェクト内で自己識別子名が複数とならないようにすることです。あるクラスでは「this」、また別のクラスでは「self」、またある別のクラスでは「x」となっているようなプログラムは書くべきではありません。自己識別子を統一することによって可読性が向上するため、意識的に統一させるようにしましょう。