В настоящее время я реализую инфраструктуру Spec в F # и хочу скрыть методы Equals, GetHashCode и т. Д. Для моего типа should
, чтобы API не загромождался этими.
Я знаю, что в C # это достигается тем, что класс реализует такой интерфейс:
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();
}
Я пытался сделать то же самое в 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
Реализовано это в моем виде:
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()
но безуспешно.
Я также пытался переопределить методы в моем типе и добавить атрибут таким образом, но это тоже не помогло.
Таким образом, остается вопрос, как я могу очистить мой API?
Edit:
Благодаря помощи (см. Ниже) мне удалось решить мою проблему.
В итоге, .Equals
и .GetHashCode
можно скрыть с помощью [<NoEquality>]
[<NoComparison>]
, но это также изменит семантику.
Скрытие через атрибуты EditorBrowsable не работает.
Единственный способ иметь чистый API и при этом иметь возможность перегружать методы - это сделать эти члены метода статическими.
Полученный класс можно найти, просмотрев внутри моего проекта FSharpSpec .
Обсуждаемый тип можно найти здесь .
Спасибо всем, кто помог мне решить эту проблему.
Ура ...