I tiene un modelo de dominio que se trivialmente representado por la siguiente.Ejecución IEquatable <T> donde T es una interfaz
IMyInterface
ClassA : IMyInterface
ClassB : IMyInterface
Lo que quiero es implementar IEquatable de forma que pueda escribir código como este.
if(dynamicallyCreatedInstanceOfClassA == dynamicallyCreatedinstanceOfClassB)
{
// Do something relevant
}
Mi primera inclinación era tener IMyInterface implementar IEquatable pero por supuesto que no se puede hacer realidad la implementación de IMyInterface. Tendría que hacer eso en ClassA y ClassB. Lo que me parece erróneo con esta solución es que las implementaciones de IEquatable en ClassA y ClassB serán exactamente, línea por línea, lo mismo. ¿Hay una forma elegante de lograr esto? Cuando aparezca ClassC, no quiero tener que copiar y pasar 50 líneas de código IEquatable duplicado.
he considerado el uso de una clase base abstracta en lugar de una interfaz, pero en este escenario IMyInterface realidad sólo describe las acciones de la clase llevará a cabo y no lo que la clase es. ClassA y ClassB no comparten muchas similitudes, excepto que ambos pueden realizar las acciones en el contrato de IMyInterface.
Cualquier información es útil, y gracias por su tiempo.
que habría sugerido a seguir el camino abstracto también, pero el inconveniente es que que van a limitar sus clases derivadas de heredar de otra clase concreta como MI no está permitido en C#.Consulte la respuesta de supercat para ver el problema potencial relacionado con 'GetHashCode'. El enfoque de Jon es la única salida fácil que parece ... – nawfal
@nawfal: el enfoque de Jon es el correcto, ya que es completamente normal y se espera que un 'IEqualityComparer' represente formas bastante amplias de equivalencia, que' T' puede no saber nada acerca de. Por ejemplo, dos objetos que implementen 'IList ' probablemente solo se den a conocer como iguales si siempre contendrán los mismos elementos en el mismo orden. Sin embargo, puede ser útil que un objeto pueda almacenar las listas que posee en un 'Diccionario , cualquiera'>, donde las listas que contienen los mismos elementos en cualquier secuencia se compararán idénticas. –
supercat
@nawfal: No existe tal método de comparación en 'IList'; las implementaciones generalmente tampoco proporcionan una. No obstante, dicho método de comparación puede ser útil en algunos contextos, por lo que sería perfectamente razonable utilizar una clase externa para implementar un 'ICEqualityComparer >' de esa manera. –
supercat