【发布时间】:2009-09-30 15:18:56
【问题描述】:
我有一个域模型,用以下内容简单地表示。
IMyInterface
ClassA : IMyInterface
ClassB : IMyInterface
我想要的是以我可以编写类似代码的方式实现 IEquatable。
if(dynamicallyCreatedInstanceOfClassA == dynamicallyCreatedinstanceOfClassB)
{
// Do something relevant
}
我的第一个想法是让 IMyInterface 实现 IEquatable,但我当然不能在 IMyInterface 中实现。我必须在 ClassA 和 ClassB 中这样做。这个解决方案让我印象深刻的是,ClassA 和 ClassB 中 IEquatable 的实现将完全一样,逐行相同。有没有一种优雅的方法来实现这一点?当 ClassC 出现时,我不想复制和过去 50 行重复的 IEquatable 代码。
我考虑过使用抽象基类而不是接口,但在这种情况下,IMyInterface 只描述了类将执行的操作,而不是类是什么。 ClassA 和 ClassB 没有太多相似之处,只是它们都可以执行 IMyInterface 合约中的操作。
任何见解都很有帮助,感谢您抽出宝贵时间。
【问题讨论】:
-
我也建议采用抽象方式,但缺点是这将限制您的派生类从另一个具体类继承,因为 C# 中不允许 MI。请参阅 supercat 的回答以了解涉及
GetHashCode的潜在问题。乔恩的方法似乎是唯一简单的出路.. -
@nawfal:Jon 的方法是正确的,因为
IEqualityComparer<T>代表相当广泛的等价形式是完全正常的,并且T可能对此一无所知。例如,碰巧实现IList<T>的两个对象可能只报告自己彼此相等,如果它们总是以相同的顺序包含相同的项目。但是,如果一个对象能够将其拥有的列表存储到Dictionary<IList<T>,whaever>中,这可能很有用,其中包含任何序列中相同项目的列表将比较相同。 -
@nawfal:
IList<T>中不存在这样的比较方法;实现通常也不提供一个。尽管如此,这种比较方法在某些情况下可能很有用,因此使用外部类以这种方式实现ICEqualityComparer<IList<T>>是完全合理的。
标签: c# .net-3.5 class-design