Comment cacher les détails d’implémentation d’une interface
J’ai entendu dire que VB était vachement mieux-mieux sur ce coup-là. Lui seul pouvait redéfinir la portée (le scope) d’un membre d’une interface… Plus précisément : une classe implémentant l’interface XYZ peut, en VB.NET, cacher l’une des méthodes de XYZ tout simplement en la déclarant privée.
Mais ce n’est pas tout à fait vrai. C# le peut aussi…
Cela dit, une interface ne devrait jamais être redéfinie au niveau des classes qui l’implémentent. Il me semble que c’est une question de bon sens : JAVA et EIFFEL ne me semblent pas permettre ce tour de passe-passe…
Lire la suite ci-dessous.
Lorsqu’une classe implémente une interface, elle doit bien entendu définir chacune des méthodes de cette interface. Or, il arrive fréquemment que ces méthodes ne s’adressent pas directement au développeur qui utilisera la classe, mais plutôt à un traitement existant. Dans ce cas, il est souvent souhaitable de « cacher » ces méthodes en les définissant au niveau de l’interface : les traitements existants pourront toujours appeler ces méthodes (puisqu’il préfixent leurs appels du nom de l’interface), mais ces dernières n’apparaitront plus dans Intellisens.
Voici un exemple : l’interface IEnumerator impose la méthode GetEnumerator(), laquelle est essentiellement destinée au traitement déclenché par l’instruction foreach. Lors de l’implémentation de cette méthode, on pourra la définir au niveau de l’interface de la façon suivante :
public class Joueur {};
public class Equipe : IEnumerable
{
private Joueur[] joueurs = null;
(...)
IEnumerator IEnumerable.GetEnumerator()
{
return new EquipeEnum( this.joueurs );
}
}
En remplaçant IEnumerator GetEnumerator() par IEnumerator IEnumerable.GetEnumerator(), on fait en sorte que la méthode ne soit plus un membre visible de la classe Equipe. Elle n’apparaitra donc pas dans Intellisens. Par contre, il sera toujours possible de l’invoquer en utilisant l’interface :
Equipe monEquipe = new Equipe(); IEnumerator enum = ((IEnumerable)monEquipe).GetEnumerator()