Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

F#で遊んでみる(10)

この本を読んでます。

8章。OOP。F#はOOPも出来ます・・・というよりは、C#が使うことを前提に設計された実行基板の上で動くので、C#と同じ事はどうやったら出来るのかという話。

まず、今までのレコードについて。

  • レコード(typeで定義するやつ)にはmemberが定義出来る。関数を入れても値を入れてもいい(JSみたいな感じかな)
    • memberで引数を持つ関数を定義すると、メソッドになる。インスタンスメソッドの自分自身を表す仮引数(C#のthis)はメソッド名の前にx.methodNameの形式で書くのが特徴
    • memberで引数を持たない関数を定義すると、プロパティになる
    • static memberを使うとクラスメソッドも定義出来る
    • overrideを使うとメソッドのオーバーライドが出来る。単にmemberを使うと親クラスのメソッドを隠蔽するよというwarningが出る
    • 明示しなければ、暗黙でSystem.Objectを継承する

レコードは特別扱いされて内部的にクラスになるが、クラスを定義することもできる。

  • クラスはtypeでプライマリコンストラクタを記述することにより定義する
    • インスタンスの初期化はletを使う
    • static letを使うと型の初期化が行われる
    • ゲッターやセッターも定義出来る
    • コンストラクタは複数定義出来る(ので、typeを使って定義するものをプライマリと呼ぶ)
    • メソッド、プロパティ以外にフィールドというものもある・・・がよくわからない
    • Abstractなクラスも定義できる

この辺りは、C#で使うものをF#で作る時には大事そう・・・だけど、今の段階では適当に理解しておくことにする。

さらにメソッドについての追加の事項

  • メソッドとコンストラクタは名前付き引数が使える。仮引数の変数名を使う
  • メソッドとコンストラクタはオプショナル引数が使える。仮引数に?をつける。つけるとoptionになる。
    • 仮引数のデフォルト値を定義するためのdefaultArg関数がある。単に第1引数がNoneなら第2引数を返す
  • メソッドはオーバーロード出来る

後は、クラスのキャストに関する話、インターフェースの定義の話、無名クラスを作るためのオブジェクト式の話があるが割愛。

さらに、nullの話がある。F#にnullはないが、互換性の観点で入ってしまうことはあり得る。無理矢理入れるためのUnchecked.defaultof<'T>という関数もある。

8.15のアクティブパターンはちょっと面倒くさそうな話なので、次回