Cuándo se utilizan delegados en lugar de interfaces (Guía de programación de C#)

Tanto los delegados como las interfaces permiten a un diseñador de clases separar las declaraciones y las implementaciones de los tipos. Una interfaz determinada puede ser heredada e implementada por cualquier clase o struct. Se puede crear un delegado para un método en cualquier clase, con tal de que el método se ajuste a la firma de método para el delegado. Cualquier objeto puede utilizar una referencia de interfaz o un delegado sin tener conocimiento alguno sobre la clase que implementa el método de interfaz o delegado. Según estas similitudes, ¿cuándo debería un diseñador de clases utilizar un delegado y cuándo una interfaz?

Utilice un delegado cuando:

  • Se utilice un modelo de diseño de eventos.

  • Se prefiere a la hora de encapsular un método estático.

  • El autor de las llamadas no tiene ninguna necesidad de obtener acceso a otras propiedades, métodos o interfaces en el objeto que implementa el método.

  • Se desea conseguir una composición sencilla.

  • Una clase puede necesitar más de una implementación del método.

Utilice una interfaz cuando:

  • Haya un grupo de métodos relacionados a los que se pueda llamar.

  • Una clase sólo necesita una implementación del método.

  • La clase que utiliza la interfaz deseará convertir esa interfaz en otra interfaz o tipos de clase.

  • El método que se va a implementar está vinculado al tipo o identidad de la clase; por ejemplo, métodos de comparación.

Un buen ejemplo del uso de una interfaz de método único en lugar de un delegado es IComparable o la versión genérica, IComparable<T>. IComparable declara el método CompareTo, que devuelve un entero que especifica una relación menor que, igual que o mayor que entre dos objetos del mismo tipo. IComparable se puede utilizar como base de un algoritmo de ordenación. Aunque utilizar un método de comparación delegado como la base de un algoritmo de ordenación sería válido, no es lo ideal. Lo ideal es una interfaz de método único, ya que la capacidad de establecer comparaciones pertenece a la clase, y el algoritmo de comparación no cambia en tiempo de ejecución.

Vea también

Referencia

Eventos (Guía de programación de C#)

Métodos (Guía de programación de C#)

Interfaces (Guía de programación de C#)

Conceptos

Guía de programación de C#