2010-05-03 4 views
12

Pendant que je travaillais sur une mise à jour, je suis tombé sur un code comme celui-ci.Implémentation implicite et explicite de l'interface

interface ICustomization 
    { 
     IMMColumnsDefinition GetColumnsDefinition(); 
    } 

    class Customization : ICustomization 
    { 
     private readonly ColumnDefinition _columnDefinition; 

     //More code here. 

     public ColumnsDefinition GetColumnsDefinition() 
     { 
      return _columnDefinition; 
     } 

     ColumnsDefinition ICustomization.GetColumnsDefinition() //redundant 
     { 
      return GetColumnsDefinition();    
     } 
    } 

Ma question est: Y at-il besoin/utilisation de la mise en œuvre « explicite » de l'interface dans ce morceau de code? Cela créera-t-il un problème si je supprime la méthode (implémentation explicite de l'interface) que j'ai marquée "redondant" ci-dessus? PS: Je comprends que la mise en œuvre explicite de l'interface est très importante, et elle peut être utilisée lorsque nous devons donner accès à une méthode au niveau de l'interface seulement, et utiliser deux interfaces avec la même signature de méthode.

Répondre

8

Yup. On dirait redondant. L'appel via une référence de type Personnalisation et un type de référence ICustomization aboutit au même comportement. Si vous vouliez que les appels ci-dessous se comportent différemment, l'implémentation explicite de l'interface aurait eu du sens.

Customization oVar = new Customization(); 
oVar.GetColumnsDefinition(); // calls 1st method 
ICustomization iVar = obj; 
iVar.GetColumnsDefinition(); // calls 2nd method - explicit impl. 

Vous devez supprimer l'implémentation explicite. Cependant, si vous supprimez l'autre implémentation, vous allez contraindre les clients à ne plus pouvoir appeler oVar.GetColumnsDefintion() - ils auront à utiliser une variable d'interface comme indiqué ci-dessus.

4

Pour info, le temps principal, vous voyez ce modèle spécifique est quand (l'une des):

  • la méthode non explicite est virtual ou abstract, pour les sous-classes à override
  • la signature du public méthode n'est pas tout à fait le même, par exemple l'API publique a un type de retour plus spécifique (commun pour des choses comme IEnumerable[<T>] ou ICloneable).
  • nous ne voulons pas qu'il soit public, mais nous voulons qu'il soit facilement appelable dans le type (sans avoir besoin d'un nop-cast)

Dans ce cas, il ne semble en effet redondant. Pourquoi une implémentation virtuelle non-explicite serait-elle une raison pour avoir aussi une implémentation explicite?

+0

Et si vous implémentez les deux et que vous créez une sous-classe, qu'arriverait-il si vous appeliez la méthode sur une variable d'interface référençant un objet de sous-classe? Pourriez-vous fournir un exemple? Voir aussi [ma question] (http://stackoverflow.com/q/10165296/537956) ._ – comecme

Questions connexes