gpt4 book ai didi

interface - 在类型定义之外实现相等

转载 作者:行者123 更新时间:2023-12-04 06:32:11 26 4
gpt4 key购买 nike

我有几种实现接口(interface)的类型。这些类型的相等性仅取决于接口(interface)成员。是否可以为这些类型定义一次相等性,而不覆盖 Equalsop_Equality每种类型?

编辑

我尝试了以下方法,但无论出于何种原因,它都覆盖了对 = 的每次使用, 即使对于没有实现 IEntity 的类型.

[<AutoOpen>]
module Equality =
let inline op_Equality (left:IEntity) (right:IEntity) = true

我还尝试使用灵活类型( #IEntity )。结果相同。

最佳答案

您正在尝试做的是混入或类型类可能在其他语言中启用的东西;不幸的是,F# 中没有等效的功能。您最好的选择可能是以下选项之一:

  • 使用抽象基类而不是接口(interface)。
  • 在您的类型之外编写您的相等方法,然后让您的所有实现都遵循它。例如,
    let entityEquals (i1:IEntity) (i2:IEntity) =
    i1.Member1 = i2.Member1 &&
    i1.Member2 = i2.Member2 &&
    ...

    type MyEntity() =
    interface IEntity with
    member x.Member1 = ...
    ...
    override x.Equals(y) =
    match y with
    | :? IEntity as y -> entityEquals x y
    | _ -> false
    override x.GetHashCode() =
    ...

    除了一些样板,这里的缺点是如果其他人实现了你的 IEntity接口(interface),他们不会被迫使用你的相等方法——它是可选的。
  • 创建另一个运算符,用于对 IEntity 进行相等性测试年代:
    let (==) (i1:IEntity) (i2:IEntity) =
    i1.Member1 = i2.Member1 &&
    ...

    这样做的(巨大)缺点是包含 IEntity 的类型的结构相等。 s(例如元组、记录等)不会使用该运算符来比较那些组件,这可能会导致令人惊讶的断码。
  • 关于interface - 在类型定义之外实现相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266723/

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