2017-09-22 4 views
0

J'essaie de comprendre comment fonctionne l'héritage des interfaces. Lorsqu'une interface hérite d'une autre interface mais possède une méthode avec la même signature, le compilateur avertit que le membre de base est caché (et cela semble logique). Cependant, lorsque j'implémente l'interface enfant dans une classe, je dois implémenter la méthode d'interface parent et enfant ayant la même signature et cela me rend confus ... Je pensais que lorsque le parent est caché, je devra mettre en œuvre uniquement la méthode de l'interface enfant?Héritage de l'interface - méthode de masquage de l'interface parent - pourquoi puis-je avoir les deux méthodes dans la classe d'implémentation?

(je suis tombé sur ce tout en regardant les interfaces IEnumerable et IEnumerable<T>)

interface IMyBase 
{ 
    int DoSomething(); 
} 

interface IMyDerived:IMyBase 
{ 
    int DoSomething(); 
} 


class myClass : IMyDerived 
{ 
    int IMyDerived.DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 

    int IMyBase.DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+3

Vous implémentez explicitement les interfaces. Dans ce cas, l'héritage est hors de la table. – CodeCaster

+0

les membres de l'interface ne peuvent pas être cachés il n'y a pas de classes –

+1

Ne mettez pas 'DoSomething()' dans 'IMyDerived', il l'hérite déjà de' IMyBase'. Le mettre dans cette interface ajoute une valeur nulle. Je suis vraiment surpris que le compilateur ne se plaint pas de ça? Je m'attendrais au moins à un avertissement. – Liam

Répondre

1

Je dois mettre en œuvre le parent et la méthode d'interface enfant ayant la même signature et cela me confond

Alors, que pensez-vous qu'il se passera si vous faites cela?

IMyBase x = new myClass(); 

x.DoSomething(); 

Il y a deux méthodes, IMyBase.Something et IMyDerived.Something, les deux doivent exister parce que les deux peuvent être appelés. myClass implémente toujours IMyBase, l'interface n'a pas été cachée en aucune façon.

+0

Dans ce cas, que signifie le message du compilateur "MyDerived.DoSomething()" masque le membre hérité 'IMyBase.DoSomething()' ... "? Il est caché dans quel contexte? – Jaxx

+0

@Jaxx Lors de l'appel d'un type 'IMyDerived',' IMyBase.DoSomething' est masqué. Vous devez d'abord lancer 'IMyBase' pour accéder à la méthode * this *. – nvoigt