2010-07-11 4 views

Répondre

17

Oui, cela ne fait aucune différence dans ce cas. Dans certains cas peut faire la différence, si vous utilisez une classe de base qui implémente déjà une interface mais que vous souhaitez la réimplémenter vous-même explicitement - mais dans ce cas il n'y a pas de classe de base (autre que la object implicite) se serait comporté exactement de la même manière. Contrairement à mes souvenirs, je ne crois pas qu'il y ait une différence dans la façon dont la classe est représentée dans les métadonnées, que le code déclare explicitement toutes les interfaces ou non. Voici un exemple:

interface IFoo {} 
interface IBar : IFoo {} 

class FooBar1 : IBar {} 
class FooBar2 : IBar, IFoo {} 

Les deux ildasm et réflecteur montrent les mêmes informations pour FooBar1 et FooBar2 ... il montre à la fois de les mettre en œuvre IBar et IFoo. En d'autres termes, nous ne pouvons pas dire si le code source original pour List<T> spécifie ou non toutes les interfaces. Peut-être que oui, peut-être que non, mais cela n'a pas d'importance.

EDIT: Pour être complet, j'ai également vérifié les cas où vous étendez deux interfaces avec une autre interface. Je ne peux pas non plus trouver de différence dans les métadonnées dans ce cas-là. Je suis sûr que je me souviens d'une situation dans laquelle il était évident, mais je ne peux pas le trouver maintenant.

+0

Donc, puisqu'il n'y a pas de classe de base. Cela ne fait pas de différence. Alors pourquoi les développeurs ont hérité de ces deux interfaces "à nouveau"? –

+0

@Marco: Voir ma version modifiée. –

+0

J'ai compris. Merci beaucoup. C'était rapide. –

5

Oui, il le ferait. IList<T> lui-même implémente les deux autres.

Le navigateur d'objets vous montre toutes les les interfaces des outils de classe, que ce soit directement (IList<T>) ou indirectement (ICollection<T>, IEnumerable<T>, parIList<T>).

+0

vous voulez dire que c'est juste un truc que fait le navigateur d'objets pour nous faciliter les choses? –

+0

Eh bien, si vous voulez le dire de cette façon. Je pense vraiment que c'est parce que le code du navigateur répertorie simplement toutes les interfaces implémentées, sans se soucier de filtrer celles étendues par d'autres. – Mau

3

Ce n'est pas la façon dont il a été codé dans les coulisses. C'est exactement ce que les outils comme Reflector vous montrent quand il retourne l'IL en C#.

+0

Vous pouvez le voir dans le visualiseur de code aussi. – Incognito

+0

@Incognito: codeviewer le génère à partir de métadonnées de la même manière que le réflecteur. – EFraim

Questions connexes