【发布时间】:2011-01-05 05:10:25
【问题描述】:
我目前正在用 F# 实现一个 Spec 框架,我想在我的 should 类型上隐藏 Equals、GetHashCode 等方法,这样 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,可以找到生成的类。
有问题的类型可以找到here.
感谢所有帮助我解决这个问题的人。
干杯...
【问题讨论】: