代码之家  ›  专栏  ›  技术社区  ›  Matthew Vines

实现IEquatable<t>其中t是接口

  •  7
  • Matthew Vines  · 技术社区  · 16 年前

    我有一个域模型,它由下面的简单表示。

    IMyInterface
    
    ClassA : IMyInterface
    
    ClassB : IMyInterface
    

    我想要的是实现IEquatable,这样我就可以编写类似的代码。

    if(dynamicallyCreatedInstanceOfClassA == dynamicallyCreatedinstanceOfClassB)
    {
      // Do something relevant
    }
    

    我的第一个倾向是让imyinterface实现IEquatable,但当然我不能真正在imyinterface中实现。我在A班和B班就得这么做。我觉得这个解决方案的错误之处在于,类A和类B中IEquatable的实现将是完全一致的。有没有一种优雅的方式来完成这一点?当ClassC出现时,我不想复制并超过50行重复的IEquatable代码。

    我曾经考虑过使用抽象基类而不是接口,但是在这个场景中,imyinterface实际上只是描述类将执行的操作,而不是类是什么。ClassA和ClassB没有很多相似之处,只是它们都可以执行imyinterface合同中的操作。

    任何见解都是有帮助的,谢谢你的时间。

    4 回复  |  直到 13 年前
        1
  •  7
  •   Jon Skeet    16 年前

    而不是执行 IEquatable<T> ,你能实施一下吗? IEqualityComparer<T> 单独上课?在大多数情况下,如果你对平等感兴趣,你可以指定一个比较器来代替,我怀疑这样会更干净。

        2
  •  5
  •   JaredPar    16 年前

    根据你的问题,你似乎知道什么是等号算法,它将是完全相同的两类A和B。为什么不做下面的

    1. 定义要从中继承的imyinterface IEquatable<IMyInterface>
    2. 定义一个抽象基类MyInterfaceBase,它实现imyInterface并具有 IEquatable<imyinterface> 实施
    3. 使ClassA和ClassB从MyInterfaceBase派生
        3
  •  1
  •   supercat    13 年前

    如果 IEquatable<T> 包括一 GetHashcode() 成员可以为不同于 Object.Equals (例如,“如果一个人只看 T ,对象是否被视为相同的”)。但是,因为它没有,所以通常没有太多的理由来实现 IEquatable<T> 除了那些可以在不添加任何奇怪语义的情况下提高性能的情况。实际上,这意味着 IEquatable<T> 要么只能由 T 本身(如果 T 是一个密封的类或结构),或者根本不是(如果 T 是可继承的,或者如果性能优势不值得努力的话)。

        4
  •  0
  •   Jon Seigel    16 年前

    我认为,如果接口不能转换为抽象类,那么直接或自动地将两个实现的类相互比较就没有多大意义。也就是说,在每个类上实现自定义比较是一种可行的方法。我相信您可以以某种方式重构比较代码,以便以后更容易地进行更改。