我目前正在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();
}
Run Code Online (Sandbox Code Playgroud)
我尝试在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
Run Code Online (Sandbox Code Playgroud)
在我的类型中实现它:
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()
Run Code Online (Sandbox Code Playgroud)
但没有成功.
我也试图覆盖我的类型中的方法并以这种方式添加属性,但这也没有做到.
所以问题仍然存在,我该如何清理我的API?
编辑:
感谢帮助(见下文),我能够解决我的问题.
总之,.Equals和.GetHashCode可以通过被隐藏 [<NoEquality>] [<NoComparison>],但也将改变语义.
通过EditorBrowsable属性隐藏不起作用.
拥有一个干净的API并且仍能够重载方法的唯一方法是使这些方法成员保持静态.
通过浏览我的项目FSharpSpec可以找到生成的类.
感谢所有帮助我解决这个问题的人.
干杯......
或者,您可以使用包含在模块中的函数使用替代样式来设计库。这是在 F# 中编写函数代码的常用方法,然后您就不需要隐藏任何标准的 .NET 方法。为了完成'kvb'给出的例子,这里是一个面向对象解决方案的例子:
type MyNum(n:int) =
member x.Add(m) = MyNum(n+m)
member x.Mul(m) = MyNum(n*m)
let n = new MyNum(1)
n.Add(2).Mul(10) // 'ToString' shows in the IntelliSense
Run Code Online (Sandbox Code Playgroud)
编写代码的功能方式可能如下所示:
type Num = Num of int
module MyNum =
let create n = Num n
let add m (Num n) = Num (m + n)
let mul m (Num n) = Num (m * n)
MyNum.create 1 |> MyNum.add 2 |> MyNum.mul 10
Run Code Online (Sandbox Code Playgroud)
如果您键入MyNum.,F# IntelliSense 将显示模块中定义的函数,因此在这种情况下您不会看到任何干扰。
重复我的回答
http://cs.hubfs.net/forums/thread/13317.aspx
在F#中,您可以通过使用NoEquality和NoComparison属性注释类型来禁止Equals和GetHashCode(并从intellisense中删除它们),如下所示.用户定义的方法也可以通过Obsolete属性或带有IsHidden = true的CompilerMessage属性从智能感知列表中隐藏.无法从F#intellisense隐藏System.Object方法GetType和ToString.
[<NoEquality; NoComparison>]
type Foo() =
member x.Bar() = ()
member x.Qux() = ()
[<System.Obsolete>]
member x.HideMe() = ()
[<CompilerMessage("A warning message",99999,IsError=false,IsHidden=true)>]
member x.WarnMe() = ()
let foo = new Foo()
foo. // see intellisense here
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
781 次 |
| 最近记录: |