web-dev-qa-db-fra.com

implémentation d'interface implicite vs explicite

Duplicata possible:
C #: Interfaces - Implémentation implicite et explicite

Quelqu'un pourrait-il expliquer les différences entre ces deux bêtes et comment les utiliser? AFAIK, de nombreuses classes pré-2.0 ont été implémentées sans types génériques, obligeant ainsi cette dernière version à implémenter les deux versions d'interfaces. Est-ce le seul cas pour lequel il faudrait les utiliser?

Pouvez-vous également expliquer en profondeur comment les utiliser.?

Merci

73
Sasha

Il y a un bon blog assez détaillé à ce sujet.

Fondamentalement, avec l'implémentation d'interface implicite, vous accédez aux méthodes et propriétés d'interface comme si elles faisaient partie de la classe. Avec des implémentations d'interfaces explicites, vous ne pouvez y accéder qu'en les traitant comme cette interface.

En ce qui concerne le moment où vous utiliseriez l'une sur l'autre, vous devez parfois utiliser une implémentation d'interface explicite car vous avez soit une propriété/méthode avec la même signature que l'interface, soit vous souhaitez implémenter deux interfaces avec les mêmes signatures et avoir des implémentations différentes pour ces propriétés/méthodes qui correspondent.

Les règles ci-dessous sont de Brad Abrams blog de directives de conception .

  • N'utilisez pas de membres explicites comme limite de sécurité. Ils peuvent être appelés par n'importe quel client qui a casté une instance sur l'interface.
  • Utilisez des membres explicites pour masquer les détails de l'implémentation
  • Utilisez des membres explicites pour approximer les implémentations d'interfaces privées.
  • Exposez une autre façon d'accéder à tous les membres implémentés explicitement que les sous-classes sont autorisées à remplacer. Utilisez le même nom de méthode, sauf en cas de conflit.

Il est également mentionné dans les commentaires du blog de Brad qu'il y a de la boxe lors de l'utilisation d'une implémentation explicite sur les types de valeur, alors soyez conscient du coût des performances.

115
Andrew Barrett

En termes simples, si une classe hérite de 2 interfaces ou plus et si les interfaces ont le même nom de méthode, la classe ne sait pas quelle méthode d'interface est implémentée si vous utilisez l'implémentation d'interface implicite. C'est l'un des scénarios où vous implémenteriez explicitement une interface.

Implémentation d'interface implicite

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

Implémentation d'interface explicite

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }

    void InterfaceTwo.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}

interface InterfaceOne
{
    void InterfaceMethod();
}

interface InterfaceTwo
{
    void InterfaceMethod();
}

Le lien suivant a une excellente vidéo expliquant ce concept
Implémentation d'interface explicite

22
Suresh

Il existe une autre façon de voir les choses, à partir de l'implémentation labyrinthique elle-même, ici: http://blogs.msdn.com/cbrumme/archive/2003/05/03/51381.aspx .

Mais en bref, l'implémentation implicite vous donne une conversion de type is-a, l'implémentation explicite ne sera accessible que si l'objet est explicitement transtypé en ce type d'interface.

4
Tanveer Badar