Interfaces C#. Implementación implícita versus implementación explícita
¿Cuáles son las diferencias en la implementación de interfaces implícita y explícitamente en C#?
¿Cuándo debería utilizar implícito y cuándo debería utilizar explícito?
¿Hay pros y/o contras de uno u otro?
Las pautas oficiales de Microsoft (de la primera edición de las Pautas de diseño del marco ) establecen que no se recomienda el uso de implementaciones explícitas , ya que le da al código un comportamiento inesperado.
Creo que esta directriz es muy válida en una época anterior al COI , cuando no se pasan cosas como interfaces.
¿Alguien podría tocar ese aspecto también?
Implícito es cuando defines tu interfaz a través de un miembro de tu clase. Explícito es cuando defines métodos dentro de tu clase en la interfaz. Sé que suena confuso, pero esto es lo que quiero decir: IList.CopyTo
se implementaría implícitamente como:
public void CopyTo(Array array, int index)
{
throw new NotImplementedException();
}
y explícitamente como:
void ICollection.CopyTo(Array array, int index)
{
throw new NotImplementedException();
}
La diferencia es que la implementación implícita le permite acceder a la interfaz a través de la clase que creó al convertir la interfaz como esa clase y como la interfaz misma. La implementación explícita le permite acceder a la interfaz solo convirtiéndola en la interfaz misma.
MyClass myClass = new MyClass(); // Declared as concrete class
myclass.CopyTo //invalid with explicit
((IList)myClass).CopyTo //valid with explicit.
Utilizo explícito principalmente para mantener limpia la implementación o cuando necesito dos implementaciones. De todos modos, rara vez lo uso.
Estoy seguro de que hay más razones para usar/no usar explícitas que otros publicarán.
Consulte la siguiente publicación en este hilo para conocer el excelente razonamiento detrás de cada uno.
La definición implícita sería simplemente agregar los métodos/propiedades, etc. exigidos por la interfaz directamente a la clase como métodos públicos.
La definición explícita obliga a los miembros a estar expuestos solo cuando se trabaja directamente con la interfaz y no con la implementación subyacente. Esto es lo preferido en la mayoría de los casos.
- Al trabajar directamente con la interfaz, no reconoce ni acopla su código a la implementación subyacente.
- En el caso de que ya tenga, digamos, una propiedad pública Nombre en su código y desee implementar una interfaz que también tenga una propiedad Nombre, hacerlo explícitamente mantendrá las dos separadas. Incluso si estuvieran haciendo lo mismo, todavía delegaría la llamada explícita a la propiedad Nombre. Nunca se sabe, es posible que desee cambiar cómo funciona Nombre para la clase normal y cómo funciona Nombre, la propiedad de interfaz más adelante.
- Si implementas una interfaz implícitamente, entonces tu clase ahora expone nuevos comportamientos que podrían ser solo relevantes para un cliente de la interfaz y eso significa que no estás manteniendo tus clases lo suficientemente concisas (en mi opinión).