在scala中,我可以要求多个特征,例如:
def foo(bar: Foo with Bar): Unit = {
// code
}
在F#中这是否也有可能,还是我必须显式声明一个继承了FooBar
和Foo
的{{1}}接口?
答案 0 :(得分:10)
您可以通过具有通用类型'T
并通过约束将'T
限制为实现所需接口的类型来进行指定。
例如,给定以下两个接口:
type IFoo =
abstract Foo : int
type IBar =
abstract Bar : int
我可以编写一个需要'T
的函数,该函数既是IFoo
也是IBar
:
let foo<'T when 'T :> IFoo and 'T :> IBar> (foobar:'T) =
foobar.Bar + foobar.Foo
现在,我可以创建一个实现两个接口的具体类,并将其传递给我的foo
函数:
type A() =
interface IFoo with
member x.Foo = 10
interface IBar with
member x.Bar = 15
foo (A()) // Type checks and returns 25