实现IEquatable <T>,其中T是一个接口

Mat*_*nes 7 c# class-design .net-3.5

我有一个域模型,由以下代表.

IMyInterface

ClassA : IMyInterface

ClassB : IMyInterface
Run Code Online (Sandbox Code Playgroud)

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

if(dynamicallyCreatedInstanceOfClassA == dynamicallyCreatedinstanceOfClassB)
{
  // Do something relevant
}
Run Code Online (Sandbox Code Playgroud)

我的第一个倾向是让IMyInterface实现IEquatable,但当然我实际上无法在IMyInterface中实现.我必须在ClassA和ClassB中这样做.这个解决方案让我觉得错误的是,ClassA和ClassB中IEquatable的实现将完全相同,行相同.有一种优雅的方式来实现这一目标吗?当ClassC出现时,我不想复制和过去50行重复的IEquatable代码.

我考虑使用抽象基类而不是接口,但在这种情况下,IMyInterface实际上只描述了类将执行的操作而不是类.ClassA和ClassB不共享许多相似之处,除非它们都可以执行IMyInterface合同中的操作.

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

Jon*_*eet 7

IEquatable<T>你可以IEqualityComparer<T>在一个单独的类中实现,而不是实现吗?在大多数情况下,你对等式感兴趣,你可以指定一个比较器,我怀疑它会更清洁.


Jar*_*Par 5

根据您的问题,您似乎知道Equals算法将是什么,并且ClassA和ClassB将完全相同.为什么不这样做呢

  1. 定义IMyInterface继承自 IEquatable<IMyInterface>
  2. 定义一个抽象基类MyInterfaceBase,它实现了IMyInterface并具有IEquatable<IMyInterface>实现
  3. 让ClassA和ClassB派生自MyInterfaceBase