Cuando implementa explícitamente la interfaz, primero debe enviar el objeto a la interfaz, luego puede llamar al método. En otras palabras, el método solo está disponible cuando el método se invoca en el objeto como el tipo de interfaz, no como el tipo concreto.
class Vehicle: IVehicle {
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(((IVehicle)this).getWheel());
}
}
Consulte este reference en MSDN para obtener más información. Aquí está el fragmento relevante:
No es posible acceder a una implementación de miembro de interfaz explícita a través de su nombre completo en una invocación de método, acceso a propiedad o acceso de indexador. Solo se puede acceder a una implementación de miembro de interfaz explícita a través de una instancia de interfaz, y en ese caso se hace referencia simplemente por su nombre de miembro.
Por lo que vale la pena: probablemente este no sea un buen uso de la implementación de interfaz explícita. Normalmente, desea utilizar la implementación explícita cuando tiene una clase que tiene una interfaz completa para operaciones típicas, pero también implementa una interfaz que puede reemplazar algunas de esas operaciones. El ejemplo canónico es una clase File
que implementa IDisposable
. Tendría un método Close()
, pero se le solicitará que implemente Dispose()
. Al tratar como File
, usaría Open/Close
. Sin embargo, cuando se abre en una instrucción using, se tratará como IDisposable
y se llamará al Dispose
. En este caso Dispose
simplemente llama al Close
. No necesariamente quiere exponer Dispose
como parte de la implementación File
ya que el mismo comportamiento está disponible en Close
.
como persona java, me pregunto por qué esto ¿Existe algo complicado? ¿Por qué alguien querría que existiera lo de arriba, qué ventaja gana? –
Especificar un modificador de visibilidad en un miembro explícitamente implementado es un error de sintaxis. El miembro siempre es accesible una vez que su objeto ha sido enviado a su tipo de interfaz. – Trillian
@mP Si está implementando múltiples interfaces con un miembro común, esto le permite suministrar diferentes definiciones de cada interfaz. También se agrega para limpiar intellisense, porque los miembros explícitos no son visibles o utilizables a menos que lo envíes a la interfaz adecuada. –