.net - una - Definiendo clases estáticas en F#
metodos estaticos php (5)
Como señaló Robert Jeppeson, una "clase estática" en C # es una mano corta para crear una clase que no puede ser instanciada o heredada, y solo tiene miembros estáticos. Aquí es cómo puedes lograr exactamente eso en F #:
[<AbstractClass; Sealed>]
type MyStaticClass private () =
static member SomeStaticMethod(a, b, c) =
(a + b + c)
static member SomeStaticMethod(a, b, c, d) =
(a + b + c + d)
Esto podría ser un poco excesivo, ya que tanto AbstractClass
como el constructor privado le impedirán crear una instancia de la clase; sin embargo, esto es lo que hacen las clases estáticas de C #: se compilan en una clase abstracta con un constructor privado. El atributo Sealed
impide heredar de esta clase.
Esta técnica no causará un error de compilación si agrega métodos de instancia como lo haría en C #, pero desde el punto de vista de la persona que llama no hay diferencia.
¿Es posible definir una clase estática que contenga miembros sobrecargables en F #? let
que los enlaces de módulos se sobrecarguen, aunque estén compilados en miembros estáticos estáticos en clases estáticas.
type
declinaciones de type
pueden contener miembros estáticos, pero no sé si el tipo en sí puede hacerse estático.
Mi solución actual es definir un type
con un constructor privado y simplemente usarlo. Me pregunto si hay una manera en que pueda definir un tipo estático como quiera.
Creo que el problema aquí es tratar de convertir F # en C #. Si el problema no se puede resolver de manera no imperativa, use C # o escriba una biblioteca orientada a objetos y úsela en F #.
Esto se explica en las Pautas de diseño de componentes de F # .
[<AbstractClass; Sealed>]
type Demo =
static member World = "World"
static member Hello() = Demo.Hello(Demo.World)
static member Hello(name: string) = sprintf "Hello %s!" name
let s1 = Demo.Hello()
let s2 = Demo.Hello("F#")
Todavía es posible definir métodos de instancia, pero no puede crear una instancia de la clase cuando no hay un constructor disponible.
No estoy seguro de que exista tal cosa como una clase estática. ''static'' en el nivel de clase en C # se introdujo en 2.0, creo, principalmente como conveniencia (evite los constructores privados y la verificación en tiempo de compilación de que no haya miembros de la instancia presentes). No puede examinar el tipo y concluir que es estático: http://msdn.microsoft.com/en-us/library/system.reflection.typeinfo.aspx
Actualización: MSDN declara que una clase estática es una clase que está sellada y tiene solo miembros estáticos: http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx
Entonces, lo que estás haciendo en este momento es la manera de hacerlo.
No hay facilidad para definir tipos estáticos en F #.
La primera alternativa es definir un módulo, pero carece de la capacidad de sobrecargar las funciones (que es lo que está buscando). La segunda alternativa es declarar un tipo normal con miembros estáticos.
Con respecto al segundo enfoque, es exactamente lo que describió la respuesta aceptada a su pregunta anterior. Yo refactorizo el código para explicarlo más fácil. Primero, se define una unión discreta ficticia de un solo caso:
type Overloads = Overloads
En segundo lugar, explota el hecho de que los miembros estáticos se pueden sobrecargar:
type Overloads with
static member ($) (Overloads, m1: #IMeasurable) = fun (m2: #IMeasurable) -> m1.Measure + m2.Measure
static member ($) (Overloads, m1: int) = fun (m2: #IMeasurable) -> m1 + m2.Measure
En tercer lugar, se propagan las restricciones de estos métodos sobrecargados a límites de uso mediante palabras clave en inline
:
let inline ( |+| ) m1 m2 = (Overloads $ m1) m2
Cuando pueda sobrecargar los límites de uso de este método, debe crear un módulo de envoltura para mantener estas funciones y marcar su tipo como private
.