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