首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现外部类型定义的相等

实现外部类型定义的相等
EN

Stack Overflow用户
提问于 2011-03-10 22:31:17
回答 2查看 199关注 0票数 2

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

编辑

我尝试了以下方法,但是,无论出于什么原因,它都覆盖了=的每一种使用,甚至对于不实现IEntity的类型也是如此。

代码语言:javascript
复制
[<AutoOpen>]
module Equality =
    let inline op_Equality (left:IEntity) (right:IEntity) = true

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-11 00:43:20

您要做的是在其他语言中可能启用混合或类型类型的功能;不幸的是,在F#中没有相同的功能。您的最佳选择可能是以下选项之一:

interface.

  • Write

  • 使用抽象基类,而不是类型之外的

  • 相等方法,然后让您的所有实现都服从它。例如,

设entityEquals (i1:IEntity) (i2:IEntity) = i1.Member1 = i2.Member1 && i1.Member2 = i2.Member2 &.类型MyEntity() =接口IEntity与成员x.Member1 =.重写x.Equals(y) =将y与_IEntity as y -> entityEquals x y AC.26_ -> false重写x.GetHashCode() =.

除了一些样板之外,这里的缺点是,如果其他人实现了您的IEntity接口,他们就不会被迫使用您的相等方法--它是opt。

  • 创建了另一个操作符,用于IEntitys的等式测试:

设(==) (i1:IEntity) (i2:IEntity) = i1.Member1 = i2.Member1 &…

(巨大的)缺点是包含IEntitys的类型的结构相等(如元组、记录等)。不会使用这个运算符来比较这些组件,这可能会导致令人惊讶的错误代码。

票数 2
EN

Stack Overflow用户

发布于 2011-03-10 23:27:39

我不认为有办法用静态的方式来做这件事。问题是扩展成员(例如,如果您将op_Equality添加为扩展)被静态成员约束忽略(例如,如果您也使用带有op_Equality需求的inlin重新定义了op_Equality)。

F#编译器只有在编译可能有帮助的FSharp.Core.dll (搜索声明let inline GenericOne的源)时才有一些特殊功能可用。它使用类似于静态类型开关的东西--但这仅仅是凡人所不能访问的。

所以,我没有比使用动态类型测试更好的想法了,这并不是一个好的方法,也许最好定义一个自定义操作符来比较您的接口。

作为参考,丑陋的动态方法是:

代码语言:javascript
复制
let inline (=) a b =
  match a, b with
  | :? IFoo as a, :? IFoo as b -> yourEquals a b
  | _ -> a = b
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5266723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档