2009-09-30 61 views
6

我有一个是平凡由以下表示的域模型。实施IEquatable <T>其中T是一个接口

IMyInterface 

ClassA : IMyInterface 

ClassB : IMyInterface 

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

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

我的第一个倾向是有IMyInterface的执行IEquatable但我当然不能真正做到在IMyInterface的各执行。我必须在ClassA和ClassB中做到这一点。这个解决方案的错误之处在于,ClassA和ClassB中的IEquatable的实现将完全一致,线条相同。有没有一种优雅的方式来实现这一点?当ClassC出现的时候,我不想复制和过去50行重复的IEquatable代码。

我一直在使用一个抽象基类,而不是一个接口考虑,但在这种情况下IMyInterface的真的只是描述动作类将执行,而不是类是什么。除了它们都可以执行IMyInterface合同中的操作之外,ClassA和ClassB不会有许多相似之处。

任何见解都很有帮助,并感谢您的时间。

+0

我会建议去抽象的方式为好,但缺点是,这将限制从另一个具体的类继承的MI是不是在C#允许你的派生类。查看supercat的答案,查看涉及'GetHashCode'的潜在问题。 Jon的方法似乎是唯一简单的方法.. – nawfal 2012-12-16 19:52:05

+1

@nawfal:Jon的方法是正确的,因为它是完全正常的,并且预期'IEqualityComparer '代表相当广泛的等价形式,'T'可能什么都不知道关于。例如,碰巧实现“IList ”的两个对象应该只能报告自己,如果它们总是以相同的顺序包含相同的项目,则它们彼此相等。然而,一个对象能够将它拥有的列表存储到“字典,whaever”中,这对于其中包含任何序列中相同项目的列表将比较相同的内容可能是有用的。 – supercat 2012-12-16 20:25:47

+1

@nawfal:'IList '中不存在此类比较方法;实现通常不提供一个。尽管如此,这种比较方法在某些情况下可能是有用的,所以使用外部类以这种方式实现“ICEqualityComparer ”是完全合理的。 – supercat 2012-12-16 20:27:50

回答

7

派生而不是实施IEquatable<T>,你可能在一个单独的类中实现IEqualityComparer<T>?在大多数情况下,如果你对平等感兴趣,你可以指定一个比较器,并且我怀疑它会更干净。

+0

这是一个好主意乔恩,感谢您的意见。我只是深入阅读了C#,它教会了我很多关于我以前从未考虑过的语言。我会立即第二次阅读它,只是为了尝试把它全部浸透。 – 2009-09-30 15:37:48

+0

@Matthew:你可能要等到第二版再读一遍 - 否则你需要全部阅读*三次* :) – 2009-09-30 15:50:39

+0

这是一个很好的观点,第二版的eta是什么? – 2009-09-30 16:31:33

0

我认为,如果接口不能转换为一个抽象类,它并没有太大的意义是两个实现的类直接或自动互相比较。这意味着对每个班级实施自定义比较将是一条路。我敢肯定,你可以以某种方式重构比较代码,以便稍后进行更改。

5

根据您的问题,好像你知道什么的Equals算法将会和这将是两个ClassA和ClassB的的完全一样。为什么不这样做以下

  1. 定义IMyInterface的从IEquatable<IMyInterface>
  2. 继承定义一个抽象基类MyInterfaceBase它实现IMyInterface的并具有IEquatable<IMyInterface>实施
  3. 有无ClassA和ClassB的从MyInterfaceBase
+0

我也考虑过这一点,我一直担心classA需要在不久的将来继承以实现其他目标,当然我可以穿过那座桥,如果我要沿着这条路线走下去我可能只是删除了接口并使用抽象基类。不是没有问题。感谢您的意见。 – 2009-09-30 15:30:50

1

如果IEquatable<T>包括一个GetHashcode()构件有可能定义明确的语义针对该类型从Object.Equals(例如不同“如果只在其存在于T特性看,将在对象被认为是相同的” )。然而,因为它没有,所以通常没有太多的理由来实施IEquatable<T>,除非它可以在不增加任何古怪的语义的情况下提高性能。在实践中,这意味着IEquatable<T>要么只能由T自身实现(如果T是一个密封类或结构),或者根本没有(如果T是继承,或者如果性能优势是不值得的努力)。

+0

+1真正解决了这个问题.. – nawfal 2012-12-16 19:49:53

相关问题