C# Language Implementación de interfaz explícita


Ejemplo

La implementación explícita de la interfaz es necesaria cuando implementa varias interfaces que definen un método común, pero se requieren diferentes implementaciones dependiendo de qué interfaz se está utilizando para llamar al método (tenga en cuenta que no necesita implementaciones explícitas si varias interfaces comparten el mismo método y una implementación común es posible).

interface IChauffeur 
{
    string Drive();
}

interface IGolfPlayer
{
    string Drive();
}

class GolfingChauffeur : IChauffeur, IGolfPlayer 
{
    public string Drive()
    {
        return "Vroom!";
    }

    string IGolfPlayer.Drive()
    {
        return "Took a swing...";
    }
}


GolfingChauffeur obj = new GolfingChauffeur();
IChauffeur chauffeur = obj;
IGolfPlayer golfer = obj;

Console.WriteLine(obj.Drive()); // Vroom!
Console.WriteLine(chauffeur.Drive()); // Vroom!
Console.WriteLine(golfer.Drive()); // Took a swing...

La implementación no se puede llamar desde ningún otro lugar excepto mediante la interfaz:

public class Golfer : IGolfPlayer
{
    string IGolfPlayer.Drive()
    {
        return "Swinging hard...";
    }
    public void Swing()
    {
        Drive(); // Compiler error: No such method
    }
}

Debido a esto, puede ser ventajoso colocar el código de implementación complejo de una interfaz implementada explícitamente en un método privado y separado.

Por supuesto, una implementación de interfaz explícita solo se puede usar para los métodos que realmente existen para esa interfaz:

public class ProGolfer : IGolfPlayer
{
    string IGolfPlayer.Swear() // Error
    {
        return "The ball is in the pit";
    }
}

De manera similar, el uso de una implementación de interfaz explícita sin declarar esa interfaz en la clase también causa un error.

Insinuación:

La implementación de interfaces explícitamente también se puede utilizar para evitar el código muerto. Cuando ya no se necesita un método y se elimina de la interfaz, el compilador se quejará de cada implementación existente.

Nota:

Los programadores esperan que el contrato sea el mismo independientemente del contexto del tipo y la implementación explícita no debe exponer un comportamiento diferente cuando se llama. Así que, a diferencia del ejemplo anterior, IGolfPlayer.Drive y Drive deberían hacer lo mismo cuando sea posible.