Interfaces C#. Implementación implícita versus implementación explícita

Resuelto Seb Nilsson asked hace 15 años • 13 respuestas

¿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?

Seb Nilsson avatar Sep 27 '08 17:09 Seb Nilsson
Aceptado

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.CopyTose 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.

mattlant avatar Sep 27 '2008 11:09 mattlant

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.

  1. Al trabajar directamente con la interfaz, no reconoce ni acopla su código a la implementación subyacente.
  2. 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.
  3. 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).
Phil Bennett avatar Sep 27 '2008 11:09 Phil Bennett