Quando utilizzare i delegati anziché le interfacce (Guida per programmatori C#)

I delegati e le interfacce consentono di separare dichiarazioni e implementazioni di tipi in una finestra di Progettazione classi. Una determinata interfaccia può essere ereditata e implementata da qualsiasi classe o struttura. Un delegato può essere creato per un metodo di qualsiasi classe, purché il metodo corrisponda alla firma del metodo per il delegato. Un oggetto può utilizzare un riferimento a un'interfaccia o un delegato in assenza di informazioni sulla classe che implementa il metodo di delegato o di interfaccia. Considerando queste analogie, di seguito sono illustrate le situazioni in cui è necessario utilizzare un delegato oppure un'interfaccia in una finestra di Progettazione classi.

Utilizzare un delegato nelle seguenti circostanze:

  • Si utilizza un modello di progettazione con eventi.

  • È preferibile incapsulare un metodo statico.

  • Non è necessario che il chiamante acceda ad altre proprietà, metodi o interfacce sull'oggetto che implementa il metodo.

  • È preferibile una composizione semplice.

  • Una classe può richiedere più di una implementazione del metodo.

Utilizzare un'interfaccia nelle seguenti circostanze:

  • È disponibile un gruppo di metodi correlati che è possibile chiamare.

  • Una classe richiede un'unica implementazione del metodo.

  • La classe che utilizza l'interfaccia eseguirà il cast dell'interfaccia in altri tipi di interfaccia o classe.

  • Il metodo implementato è collegato al tipo o all'identità della classe, ad esempio nel caso dei metodi di confronto.

IComparable o la versione generica IComparable<T> rappresenta un valido esempio in cui si preferisce un'interfaccia con un singolo metodo a un delegato. IComparable dichiara il metodo CompareTo, il quale restituisce un intero che specifica una relazione minore di, uguale a o maggiore di tra due oggetti dello stesso tipo. IComparable può essere utilizzata come base per un algoritmo di ordinamento. Pur essendo valido, un metodo di confronto basato su delegati come base per un algoritmo di ordinamento non rappresenta la soluzione ideale. Poiché la funzionalità di confronto appartiene alla classe e l'algoritmo di confronto non viene modificato in fase di esecuzione, l'interfaccia con un singolo metodo costituisce la scelta ottimale.

Vedere anche

Riferimenti

Eventi (Guida per programmatori C#)

Metodi (Guida per programmatori C#)

Interfacce (Guida per programmatori C#)

Concetti

Guida per programmatori C#