Lorsque vous implémentez explicitement l'interface, vous devez d'abord convertir l'objet en interface, puis vous pouvez appeler la méthode. En d'autres termes, la méthode n'est disponible que lorsque la méthode est appelée sur l'objet en tant que type d'interface, et non en tant que type concret.
class Vehicle: IVehicle {
public int IVehicle.getWheel()
{
return wheel;
}
public void printWheel()
{
Console.WriteLine(((IVehicle)this).getWheel());
}
}
Voir ce reference à MSDN pour plus d'informations. Voici l'extrait pertinent:
Il est impossible d'accéder à une implémentation membre d'interface explicite par son nom complet dans un appel de méthode, l'accès à la propriété ou l'accès indexeur. Une implémentation de membre d'interface explicite ne peut être accédée qu'à travers une instance d'interface, et est dans ce cas référencée simplement par son nom de membre.
Pour ce que cela vaut - ce n'est probablement pas une utilisation particulièrement bonne de l'implémentation d'interface explicite. En règle générale, vous souhaitez utiliser une implémentation explicite lorsque vous disposez d'une classe disposant d'une interface complète pour les opérations classiques, mais implémente également une interface qui peut remplacer certaines de ces opérations. L'exemple canonique est une classe File
qui implémente IDisposable
. Il aurait une méthode Close()
, mais serait nécessaire pour implémenter Dispose()
. En traitant comme File
vous utiliseriez Open/Close
. Lorsqu'elle est ouverte dans une instruction using, elle la traite comme IDisposable
et appelle le Dispose
. Dans ce cas Dispose
appelle simplement Close
. Vous ne voulez pas nécessairement exposer Dispose
dans le cadre de l'implémentation File
puisque le même comportement est disponible à partir de Close
.
comme une personne java, je me demande pourquoi ce chose alambiquée existe? Pourquoi quelqu'un voudrait-il que ce qui précède existe, quel avantage cela procure-t-il? –
La spécification d'un modificateur de visibilité sur un membre explicitement implémenté est une erreur de syntaxe. Le membre est toujours accessible une fois que votre objet a été casté sur votre type d'interface. – Trillian
@mP Si vous implémentez plusieurs interfaces avec un membre commun, cela vous permet de fournir différentes définitions par interface. En outre, il ajoute à nettoyer intellisense, parce que les membres explicites ne sont pas visibles ou utilisables, sauf si vous lancez à l'interface appropriée. –