C# Language Implementazione esplicita dell'interfaccia

Esempio

L'implementazione esplicita dell'interfaccia è necessaria quando si implementano più interfacce che definiscono un metodo comune, ma sono necessarie implementazioni diverse a seconda dell'interfaccia utilizzata per chiamare il metodo (si noti che non sono necessarie implementazioni esplicite se più interfacce condividono lo stesso metodo e è possibile un'implementazione comune).

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

L'implementazione non può essere richiamata da nessun'altra parte se non utilizzando l'interfaccia:

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

A causa di ciò, può essere vantaggioso inserire un codice di implementazione complesso di un'interfaccia esplicitamente implementata in un metodo privato separato.

Un'implementazione esplicita dell'interfaccia può naturalmente essere utilizzata solo per i metodi effettivamente esistenti per quell'interfaccia:

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

Allo stesso modo, l'utilizzo di un'implementazione esplicita dell'interfaccia senza dichiarare che l'interfaccia sulla classe causa anche un errore.

Suggerimento:

Implementare le interfacce in modo esplicito può anche essere usato per evitare il dead code. Quando un metodo non è più necessario e viene rimosso dall'interfaccia, il compilatore si lamenterà di ogni implementazione ancora esistente.

Nota:

I programmatori si aspettano che il contratto sia lo stesso indipendentemente dal contesto del tipo e l'implementazione esplicita non dovrebbe esporre un comportamento diverso quando viene chiamata. Quindi, a differenza dell'esempio sopra, IGolfPlayer.Drive e Drive dovrebbero fare la stessa cosa quando possibile.