我有一个是平凡由以下表示的域模型。实施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不会有许多相似之处。
任何见解都很有帮助,并感谢您的时间。
我会建议去抽象的方式为好,但缺点是,这将限制从另一个具体的类继承的MI是不是在C#允许你的派生类。查看supercat的答案,查看涉及'GetHashCode'的潜在问题。 Jon的方法似乎是唯一简单的方法.. – nawfal 2012-12-16 19:52:05
@nawfal:Jon的方法是正确的,因为它是完全正常的,并且预期'IEqualityComparer'代表相当广泛的等价形式,'T'可能什么都不知道关于。例如,碰巧实现“IList ”的两个对象应该只能报告自己,如果它们总是以相同的顺序包含相同的项目,则它们彼此相等。然而,一个对象能够将它拥有的列表存储到“字典,whaever”中,这对于其中包含任何序列中相同项目的列表将比较相同的内容可能是有用的。 –
supercat
2012-12-16 20:25:47
@nawfal:'IList'中不存在此类比较方法;实现通常不提供一个。尽管如此,这种比较方法在某些情况下可能是有用的,所以使用外部类以这种方式实现“ICEqualityComparer ”是完全合理的。 –
supercat
2012-12-16 20:27:50