Actualmente estoy implementando un framework Spec en F # y quiero ocultar los métodos Equals, GetHashCode etc. en mi tipo should
, para que la API no esté saturada con estos.¿Cómo puedo ocultar los métodos en F #?
sé en C# que se realiza haciendo la clase implemente una interfaz como esta:
using System;
using System.ComponentModel;
public interface IFluentInterface
{
[EditorBrowsable(EditorBrowsableState.Never)]
bool Equals(object other);
[EditorBrowsable(EditorBrowsableState.Never)]
string ToString();
[EditorBrowsable(EditorBrowsableState.Never)]
int GetHashCode();
[EditorBrowsable(EditorBrowsableState.Never)]
Type GetType();
}
He intentado hacer lo mismo en C#:
type IFluentInterface = interface
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract Equals : (obj) -> bool
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract ToString: unit -> string
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract GetHashCode: unit -> int
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract GetType : unit -> Type
end
puesto en práctica en mi tipo:
interface IFluentInterface with
member x.Equals(other) = x.Equals(other)
member x.ToString() = x.ToString()
member x.GetHashCode() = x.GetHashCode()
member x.GetType() = x.GetType()
pero sin éxito.
También traté de anular los métodos en mi tipo y agregar el atributo de esa manera, pero eso tampoco funcionó.
Entonces, la pregunta sigue siendo, ¿cómo puedo limpiar mi API?
Editar:
Gracias a la ayuda (véase más adelante) que fue capaz de resolver mi problema.
En resumen, .Equals
y .GetHashCode
se puede ocultar a través de [<NoEquality>]
[<NoComparison>]
sino que también va a cambiar la semántica.
La ocultación mediante atributos EditorBrowsable no funciona.
La única manera de tener una API limpia y aún poder sobrecargar métodos es hacer que estos miembros de método estén estáticos.
La clase resultante se puede encontrar navegando dentro de mi proyecto FSharpSpec.
El tipo en cuestión se puede encontrar here.
Gracias a todos los que me ayudó a resolver este problema.
Saludos ...
Voy a analizar eso, ¿supongo que este enfoque también me permitirá sobrecargar los métodos? - En otra nota, disfruté tus proyecciones de pantalla en F #. –
¡Gracias! Desafortunadamente, las funciones declaradas usando 'let' no se pueden sobrecargar. La sobrecarga solo se admite para declaraciones de 'miembros'. Consulte otras preguntas sobre SO sobre sobrecarga en F # - p. http://stackoverflow.com/questions/2260939/f-overloading-functions –
Bueno, en ese caso necesitaría usar un tipo, ya que dependo mucho de la capacidad de sobrecargar los métodos, se puede imaginar que debe.contain (real, esperado) debe implementarse de manera diferente para cadenas que para secuencias, por ejemplo. ¿Es posible sobrecargar los miembros estáticos? Obviamente, si quisiera que mi clase Assertion y sus miembros permanezcan estáticos, no mostraría ningún método .ToString() ... –