Fsharp-classes

提供:Dev Guides
移動先:案内検索

F#-クラス

クラスは、プロパティ、メソッド、およびイベントを持つことができるオブジェクトを表す型です。 「これらは、アプリケーションのアクション、プロセス、および概念的なエンティティをモデル化するために使用されます」。

構文

クラスタイプを定義するための構文は次のとおりです-

//Class definition:
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 ]

//Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...

どこで、

  • type-name は有効な識別子です。 これに対するデフォルトのアクセス修飾子は public です。
  • type-params は、オプションのジェネリック型パラメーターを説明します。
  • parameter-list は、コンストラクタパラメータを記述します。 プライマリコンストラクターのデフォルトのアクセス修飾子は public です。
  • オプションの as キーワードと共に使用される identifier は、インスタンス変数または self-identifier に名前を付けます。これは、型のインスタンスを参照するために型定義で使用できます。
  • inherit キーワードを使用すると、クラスの基本クラスを指定できます。
  • let バインディングを使用すると、クラスに対してローカルなフィールドまたは関数値を宣言できます。
  • do-bindings セクションには、オブジェクトの構築時に実行されるコードが含まれています。
  • member-list は、追加のコンストラクター、インスタンスおよび静的メソッドの宣言、インターフェイス宣言、抽象バインディング、プロパティおよびイベント宣言で構成されます。
  • 定義の開始と終了を示すキーワード classend はオプションです。

クラスのコンストラクター

コンストラクターは、クラス型のインスタンスを作成するコードです。

F#では、コンストラクターは他の.Net言語とほとんど異なる動作をします。 クラス定義では、プライマリコンストラクターの引数はparameter-listとして記述されます。

コンストラクターの本体は、 let および do バインディングで構成されます。

あなたは新しいキーワードを使用してメンバーを追加することにより、追加のコンストラクタを追加することができます-

new (argument-list) = constructor-body

次の例は、概念を示しています-

次のプログラムは、クラスのオブジェクトが作成されている間にラインの長さを計算するコンストラクタとともにラインクラスを作成します-

type Line = class
   val X1 : float
   val Y1 : float
   val X2 : float
   val Y2 : float

   new (x1, y1, x2, y2) as this =
      { X1 = x1; Y1 = y1; X2 = x2; Y2 = y2;}
      then
         printfn " Creating Line: {(%g, %g), (%g, %g)}\nLength: %g"
            this.X1 this.Y1 this.X2 this.Y2 this.Length

   member x.Length =
      let sqr x = x * x
      sqrt(sqr(x.X1 - x.X2) + sqr(x.Y1 - x.Y2) )
end
let aLine = new Line(1.0, 1.0, 4.0, 5.0)

あなたがプログラムをコンパイルして実行すると、次の出力が得られます-

Creating Line: {(1, 1), (4, 5)}
Length: 5

バインドをしましょう

クラス定義のletバインディングを使用すると、F#クラスのプライベートフィールドとプライベート関数を定義できます。

type Greetings(name) as gr =
   let data = name
   do
      gr.PrintMessage()
   member this.PrintMessage() =
      printf "Hello %s\n" data
let gtr = new Greetings("Zara")

あなたがプログラムをコンパイルして実行すると、次の出力が得られます-

Hello Zara

_Greetings_クラスに自己識別子_gr_を使用していることに注意してください。