Ho un modello di dominio che è banalmente rappresentato dal seguente.Implementazione IEquatable <T> dove T è un'interfaccia
IMyInterface
ClassA : IMyInterface
ClassB : IMyInterface
Quello che voglio è implementare IEquatable in modo tale da poter scrivere codice come qualcosa.
if(dynamicallyCreatedInstanceOfClassA == dynamicallyCreatedinstanceOfClassB)
{
// Do something relevant
}
Il mio primo istinto era quello di avere IMyInterface implementare IEquatable ma naturalmente non può realmente fare la attuazione in IMyInterface. Dovrei farlo in ClassA e ClassB. Ciò che mi colpisce di questa soluzione è che le implementazioni di IEquatable in ClassA e ClassB saranno esattamente, linea per linea uguale. C'è un modo elegante per realizzare questo? Quando arriva ClassC non voglio dover copiare e incollare 50 righe di codice IEquatable duplicato.
Ho considerato l'utilizzo di una classe base astratta anziché un'interfaccia, ma in questo scenario IMyInterface descrive solo le azioni che la classe eseguirà e non ciò che la classe è. ClassA e ClassB non condividono molte somiglianze, tranne che possono entrambe eseguire le azioni nel contratto IMyInterface.
Qualsiasi approfondimento è utile, e grazie per il vostro tempo.
Avrei anche suggerito di seguire la via astratta, ma lo svantaggio è che limiterà le classi derivate dall'erogare da un'altra classe concreta poiché MI non è consentito in C#.Vedi la risposta di supercat per vedere il potenziale problema che coinvolge 'GetHashCode'. L'approccio di Jon è l'unica via facile che sembra .. – nawfal
@nawfal: l'approccio di Jon è quello giusto, poiché è del tutto normale e previsto per un 'IEqualityComparer' per rappresentare forme piuttosto ampie di equivalenza che 'T' potrebbe non sapere nulla di. Ad esempio, due oggetti che si verificano per implementare 'IList ' dovrebbero probabilmente riportarsi uguali tra loro se contengono sempre gli stessi elementi nello stesso ordine. Può essere utile, tuttavia, che un oggetto sia in grado di memorizzare gli elenchi che possiede in un 'Dictionary , whaever>', dove gli elenchi contenenti gli stessi elementi in qualsiasi sequenza saranno comparabili. –
supercat
@nawfal: non esiste un metodo di confronto simile in 'IList'; le implementazioni generalmente non ne forniscono neanche uno. Ciononostante, un tale metodo di confronto può essere utile in alcuni contesti, quindi sarebbe perfettamente ragionevole usare una classe esterna per implementare un 'ICEqualityComparer >' in questo modo. –
supercat