オブジェクト式 (F#)
オブジェクト式とは、既存の基本型、インターフェイス、または一連のインターフェイスに基づいて動的に作成される匿名のオブジェクト型の新しいインスタンスを作成する式です。
// When typename is a class:
{ new typename [type-params] arguments with
member-definitions
[ additional-interface-definitions ]
}
// When typename is not a class:
{ new typename [generic-type-args] with
member-definitions
[ additional-interface-definitions ]
}
解説
前の構文で、typename は既存のクラス型またはインターフェイス型を表します。type-params は省略可能なジェネリック型パラメーターを示します。arguments は、コンストラクター パラメーターを必要とするクラス型にのみ使用されます。member-definitions は、基本クラスのメソッドのオーバーライド、または基本クラスかインターフェイスの抽象メソッドの実装です。
さまざまなオブジェクト式の例を次に示します。
// This object expression specifies a System.Object but overrides the
// ToString method.
let obj1 = { new System.Object() with member x.ToString() = "F#" }
printfn "%A" obj1
// This object expression implements the IFormattable interface.
let Delimiter(delim1 : string, delim2 : string ) = { new System.IFormattable with
member x.ToString(format : string, provider : System.IFormatProvider) =
if format = "D" then delim1 + x.ToString() + delim2
else x.ToString()
}
let obj2 = Delimiter("{","}");
printfn "%A" (System.String.Format("{0:D}", obj2))
// This object expression implements multiple interfaces.
type IFirst =
abstract F : unit -> unit
abstract G : unit -> unit
type ISecond =
inherit IFirst
abstract H : unit -> unit
abstract J : unit -> unit
// This object expression implements an interface chain.
let Implementer() = { new ISecond with
member this.H() = ()
member this.J() = ()
interface IFirst with
member this.F() = ()
member this.G() = ()
}
オブジェクト式の使用
新しい名前付きの型を作成するときに追加のコードやオーバーヘッドが必要とならないようにするには、オブジェクト式を使用します。オブジェクト式を使用して、プログラムで作成される型の数をできるだけ少なくすると、コードの行数を減らし、型が不必要に増えないようにすることができます。オブジェクト式を使用すると、特定の状況に対処するためだけに多数の型を作成する代わりに、既存の型をカスタマイズしたり、特定の状況に適したインターフェイスの実装を簡単に提供したりすることができます。