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