gpt4 book ai didi

interface - 有没有更简单的方法在 F# 中隐式使用接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 05:50:20 25 4
gpt4 key购买 nike

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

界面是:

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) .调用在同一接口(interface)中实现的方法的最简单方法是什么?

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

最佳答案

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

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)

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

关于interface - 有没有更简单的方法在 F# 中隐式使用接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com