Выражения объекта (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() = ()
}
Использование выражений объекта
Выражения объекта используются, когда требуется избегать дополнительного кода и служебных данных, что требуется для создания нового именованного типа. Если использовать выражения объекта для минимизации числа типов, созданных в программе, можно сократить число строк кода и предотвратить ненужное увеличение числа типов. Вместо создания множества типов для различных ситуаций можно использовать выражение объекта, которое настроит существующий тип или предоставит соответствующую реализацию интерфейса для конкретного случая.