当参数是对象类型时,如何在F#中要求多个接口?

时间:2019-06-20 13:25:34

标签: scala f#

在scala中,我可以要求多个特征,例如:

def foo(bar: Foo with Bar): Unit = {
  // code
}

在F#中这是否也有可能,还是我必须显式声明一个继承了FooBarFoo的{​​{1}}接口?

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