Como ocultar métodos em F #?
No momento, estou implementando uma estrutura Spec em F # e quero ocultar os métodos Equals, GetHashCode etc. no meushould
tipo, para que a API não seja confusa com eles.
Eu sei que em C # isso é feito, fazendo a classe implementar uma interface 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();
}
Eu tentei fazer o mesmo em F #:
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
Implementado no meu 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()
mas sem sucesso.
Também tentei substituir os métodos no meu tipo e adicionar o atributo dessa maneira, mas isso também não funcionou.
Portanto, a questão permanece: como posso limpar minha API?
Editar:
Graças à ajuda (veja abaixo), consegui resolver o meu problema.
Em suma,.Equals
e.GetHashCode
pode ser oculto via[<NoEquality>]
[<NoComparison>]
mas isso também mudará a semântica.
A ocultação através dos atributos EditorBrowsable não funciona.
A única maneira de ter uma API limpa e ainda poder sobrecarregar métodos é tornar esses membros do método estáticos.
A classe resultante pode ser encontrada navegando dentro do meu projetoFSharpSpec.
O tipo em questão pode ser encontradoaqui.
Obrigado a todos que me ajudaram a resolver este problema.
Felicidades ...