В настоящее время я реализую структуру Spec в F #, и я хочу скрыть методы Equals, GetHashCode и т. Д. На моем should
типах, чтобы API не был загроможден этими.Как скрыть методы в F #?
Я знаю, что в 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.
рассматриваемого типа можно найти here.
Спасибо всем, кто помог мне решить эту проблему.
Приветствия ...
Я рассмотрю это, я предполагаю, что этот подход также позволит мне перегрузить методы? - На другой ноте я наслаждался вашими экранами на F #. –
Спасибо! К сожалению, функции, объявленные с использованием 'let', не могут быть перегружены. Перегрузка поддерживается только для объявлений 'member'. См. Другие вопросы SO о перегрузке в F #. http://stackoverflow.com/questions/2260939/f-overloading-functions –
В этом случае мне нужно будет использовать тип, так как я сильно зависеть от способности перегружать методы, вы можете себе представить, что should.contain (фактические, ожидаемые) должны выполняться по-разному для строк, чем для последовательностей, например. Возможно ли перегрузить статические элементы? Очевидно, что если бы я сделал статический класс Assertion и его членов, он не продемонстрировал бы никаких методов .ToString() .... –