È necessario creare sovraccarichi per le funzioni su un'interfaccia esistente senza influire sui componenti che attualmente implementano o utilizzano l'interfaccia (idealmente).Aggiunta di nuove funzioni a un'interfaccia
Immagino ho un paio di opzioni:
semplificato interfaccia originale:
public interface IServerComponent
{
bool Add(int a, int b);
}
posso aggiungere le nuove funzioni sovraccaricate per l'interfaccia e forzare ogni classe che implementa l'interfaccia per implementare le nuove funzioni.
public interface IServerComponent
{
bool Add(int a, int b);
bool Add(int a, int b, int c);
}
Oppure posso creare una nuova interfaccia che implementa l'interfaccia originale. Poi altre classi che fanno uso della originale non avranno bisogno di cambiare e di eventuali nuove classi possono implementare la nuova interfaccia ...
public interface IServerComponent2 : IServerComponent
{
bool Add(int a, int b, int c);
}
Qual è la migliore pratica è questa situazione? Ci sono altre opzioni disponibili?
Grazie
+1 Per menzionare metodi di estensione – ram
metodi di estensione funzionerà, ma avrà anche l'effetto di diffusione della funzionalità della classe di esecuzione attraverso altre classi riducenti coesione. La vedo come una soluzione temporanea al meglio. Nel caso in cui non è possibile estendere la classe, poiché non si ha accesso alla fonte, i metodi di estensione hanno senso. Potrei farlo in questo modo per aggiornamenti minori di una base di codice esistente, ma certamente lo inserirò nella mia lista di refactoring per la prossima major release. – tvanfosson
Questo dipende totalmente dal design. Se aggiungete * nuove funzionalità *, sarei d'accordo; appartiene a un'interfaccia. Se stai aggiungendo * overload * (ad esempio, funzionalità quasi identiche, sempre espresse in termini di altre funzionalità), non sono d'accordo. In questo caso, i metodi di estensione consentono * l'ortogonalità *, riducendo la duplicazione del codice. [Joe Duffy] (http://www.bluebytesoftware.com/blog/2010/02/10/ExtensionMethodsAsDefaultInterfaceMethodImplementations.aspx) ha un buon post sul blog sull'argomento. –