我目前在F#中實現了一個Spec框架,我想隱藏我的should
類型上的Equals,GetHashCode等方法,以便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?
編輯:
感謝幫助(見下文),我能解決我的問題。
總之,.Equals
和.GetHashCode
可以隱藏通過[<NoEquality>]
[<NoComparison>]
但這也會改變語義。
通過EditorBrowsable屬性隱藏不起作用。
擁有乾淨的API並仍然能夠重載方法的唯一方法是使這些方法成員爲靜態。
生成的類可以通過在我的項目FSharpSpec中瀏覽找到。
有問題的類型,可以發現here.
謝謝大家誰幫我解決這個問題。
乾杯......
我會研究一下,我認爲這種方法也會讓我重載這些方法嗎? - 另一方面,我喜歡在F#上進行屏幕演示。 – 2010-03-05 18:09:52
謝謝!不幸的是,使用'let'聲明的函數不能被重載。只有「成員」聲明支持重載。查看有關F#中重載的其他SO問題 - 例如http://stackoverflow.com/questions/2260939/f-overloading-functions – 2010-03-05 18:35:12
那麼在這種情況下,我需要使用一個類型,因爲我非常依賴於重載方法的能力,你可以想象一個should.contain (實際的,預期的)需要針對字符串以不同的順序執行,而不是針對例如序列。 雖然可以重載靜態成員嗎?很明顯,如果我將我的Assertion類及其成員設爲靜態,它將不會顯示任何.ToString()...方法。 – 2010-03-05 19:42:45