【问题标题】:Is there a simpler way to use interfaces in F# implicitly?有没有更简单的方法在 F# 中隐式使用接口?
【发布时间】:2014-04-28 01:34:21
【问题描述】:

我正在通过创建一个简单的数据访问类来使用 F# 接口。

界面是:

type IUserAccess =
    abstract member GetUsers : (dbSchema.ServiceTypes.Users -> bool) -> dbSchema.ServiceTypes.Users seq 
    abstract member GetAllUsers : unit -> dbSchema.ServiceTypes.Users seq 

在课堂上,我是这样调用方法的:

type UserAccess() = 
    let db = dbSchema.GetDataContext()
    interface IUserAccess with
        member this.GetUsers cond  =
            let query = query {
                for row in db.Users do
                select row } 
            query |> Seq.where cond

        member this.GetAllUsers () =
            (this:>IUserAccess).GetUsers (fun _ -> true)

我有点担心的是我调用GetAllUsers 函数的方式,特别是(this:>IUserAccess) 部分。调用在同一接口中实现的方法的最简单方法是什么?

我能想到的一个简单选项是直接在UserAccess() 类中创建GetUsers 方法,然后从GetUsersGetAllUsers 的接口实现中调用它,但这意味着实现了一个新的私有方法,它我想避免。还有其他选择吗?

【问题讨论】:

    标签: interface f#


    【解决方案1】:

    如果您想避免直接在类中定义单独的方法,我认为@vcsjones 的解决方案可能是最佳选择。也就是说,声明一个单独的方法实际上并没有那么难看。您可以使用let 绑定(自动编译为私有方法)使用本地定义,我认为它使代码看起来相当不错:

    type UserAccess() = 
        let db = dbSchema.GetDataContext()
        let getUsers cond = 
          let query = query {
              for row in db.Users do
              select row } 
          query |> Seq.where cond
    
        interface IUserAccess with
            member this.GetUsers cond  = getUsers cond
            member this.GetAllUsers () = getUsers (fun _ -> true)
    

    我通常非常喜欢这种风格,因为它将所有私有实现与定义的公共公开 API 的定义部分分开。

    【讨论】:

      【解决方案2】:

      F# 总是显式地实现接口,因此您的选项与您所说的差不多,但是您可以通过引入 let 绑定来避免多余的强制转换:

      type IUserAccess =
          interface
              abstract member GetUsers : (obj -> bool) -> unit
              abstract member GetAllUsers : unit -> unit
          end
      
      type Foo() as self =
          let userAccess = self :> IUserAccess
          interface IUserAccess with
              member this.GetUsers(q : (obj -> bool)) : unit =
                 ()
              member this.GetAllUsers() =
                  userAccess.GetUsers(fun _ -> true)
      

      我只是简化了你的界面和对象,所以我可以快速编译一些东西。

      【讨论】:

      • 谢谢,这正是我一直在寻找的简单改进!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2010-09-30
      • 1970-01-01
      • 2023-02-21
      • 2017-12-18
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多