Expresiones de objeto (F#)
Una expresión de objeto es una expresión que crea una nueva instancia de un tipo de objeto anónimo creado dinámicamente que se basa en un tipo base, una interfaz o un conjunto de interfaces existente.
// 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 ]
}
Comentarios
En la sintaxis anterior, typename representa un tipo de clase o tipo de interfaz existente. type-params describe los parámetros de tipo genérico opcionales. El parámetro arguments se usa únicamente para los tipos de clase, que requieren parámetros de constructor. El parámetro member-definitions representa reemplazos de métodos de clase base o implementaciones de métodos abstractos de una clase base o una interfaz.
En el ejemplo siguiente se muestran diferentes tipos de expresiones de objeto.
// 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() = ()
}
Uso de expresiones de objeto
Las expresiones de objeto se usan cuando se desean evitar el código adicional y la sobrecarga que se requieren para crear un nuevo tipo con nombre. El uso de expresiones de objeto para minimizar el número de tipos creados en un programa permite reducir el número de líneas de código y evitar la proliferación innecesaria de tipos. En lugar de crear muchos tipos simplemente para hacer frente a situaciones concretas, se puede usar una expresión de objeto que personalice un tipo existente o proporcione una implementación apropiada de una interfaz para el caso en cuestión.