C# Language Implémentation d'interface explicite


Exemple

Une implémentation d'interface explicite est nécessaire lorsque vous implémentez plusieurs interfaces qui définissent une méthode commune, mais différentes implémentations sont requises selon l'interface utilisée pour appeler la méthode (notez que vous n'avez pas besoin d'implémentations explicites si plusieurs interfaces partagent la même méthode et une implémentation commune est possible).

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'implémentation ne peut pas être appelée de n'importe où sauf en utilisant l'interface:

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

De ce fait, il peut être avantageux de placer le code d'implémentation complexe d'une interface explicitement implémentée dans une méthode séparée et privée.

Une implémentation d'interface explicite ne peut bien entendu être utilisée que pour les méthodes existantes pour cette interface:

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

De même, l'utilisation d'une implémentation d'interface explicite sans déclarer cette interface sur la classe provoque également une erreur.

Allusion:

L'implémentation d'interfaces peut également être utilisée pour éviter le code mort. Lorsqu'une méthode n'est plus nécessaire et est supprimée de l'interface, le compilateur se plaindra de chaque implémentation existante.

Remarque:

Les programmeurs s'attendent à ce que le contrat soit le même, quel que soit le contexte du type, et une implémentation explicite ne devrait pas exposer un comportement différent à l'appel. Donc, contrairement à l'exemple ci-dessus, IGolfPlayer.Drive et Drive devraient faire la même chose lorsque cela est possible.