Explicit interface implementation no le permite especificar ningún modificador de acceso. Cuando implementa explícitamente un miembro de interfaz (especificando el nombre de la interfaz antes del nombre del miembro), puede acceder a ese miembro solo con esa interfaz. Básicamente, si lo hace:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
Puede no:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
Existen varios casos de uso de EII. Por ejemplo, desea proporcionar un método Close
para que su clase libere los recursos adquiridos pero aún desea implementar IDisposable
. Se podría hacer:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
De esta manera, los consumidores de clase sólo pueden llamar directamente Close
(y ni siquiera verán Dispose
en la lista de Intellisense) pero todavía se puede utilizar la clase Test
donde se espera una IDisposable
(por ejemplo, en una declaración using
).
Otro caso de uso para la EII está proporcionando diferentes implementaciones de un miembro de interfaz con el mismo nombre para dos interfaces:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
Como se ve, sin EII Es ni siquiera es posible para implementar ambas interfaces de este ejemplo en una sola clase (ya que las propiedades difieren solo en el tipo de devolución). En otros casos, es posible que desee proporcionar intencionalmente un comportamiento diferente para vistas individuales de una clase a través de diferentes interfaces.
Esto no es una razón muy fuerte ya que todavía tiene que especificar manualmente el público para todos los miembros implementados implícitamente. Si ese fuera el caso, el compilador podría asumir automáticamente esos también como públicos. –
Esto es incorrecto, ya que puede tener interfaces internas. –