Dans le cours : C# : Les collections et génériques

Explorer les interfaces génériques

Nous allons voir comment les interfaces génériques peuvent rendre nos classes plus réutilisables. Alors, on a notre catalogue, ici un catalogue de films, dans lequel on utilise une classe générique qui s'adapte au film, une collection List. Et puis, on retourne cette collection de List avec Tout pour permettre son énumération ici par un foreach. catalogue.Tout va nous permettre d'afficher tous les films qui sont dans notre catalogue. Le problème de ce Tout ici, c'est qu'il retourne une liste de films et si quelqu'un utilise ma propriété, contrairement à ce que j'avais prévu, non seulement pour un foreach mais par exemple, pourquoi pas, pour effacer le contenu, chose que je n'avais pas prévue, ou pour ajouter un film mais qui existerait déjà, donc il pourrait très bien faire un Tout mais en faisant un ajouter, un Add, donc il ajouterait un film peut-être que j'ai déjà rajouté. Donc j'aurai des doublons dans ma collection. Pour éviter cela, ce que je vais vouloir faire, c'est retourner autre chose que la liste entière et peut-être quelque chose de plus restreint en fonctionnalités. Alors c'est là où les interfaces vont m'aider, c'est que l'interface de collection la plus restreinte, c’est IEnumerable. Elle permet de faire un foreach et rien d'autre. Donc simplement en mettant cela, j'ai mon programme qui va restreindre. Comment il tolère le fait que je change le type de retour ? Tout simplement parce que mon List ici implémente IEnumerable, donc propose cette interface, et donc aucun problème de conversion. Et ici maintenant, si je faisais .quelque chose, je n'obtiendrai juste qu’un Enumerator, ce que requiert le foreach, et donc c'est pour cela qu’il est toujours satisfait. Mais par contre, je ne peux plus faire de Clear ou de Add comme tout à l'heure. Ce IEnumerable peut être utile aussi si jamais je voulais proposer autre chose que simplement tous les films mais une portion de mes films, donc avoir une date bien définie, et puis, un max. Et donc cette date bien définie, en parcourant ma liste, je peux comparer la date de sortie du film de la liste avec cette date définie, et ne retourner que cette date. Je pourrais constituer une collection et la retourner mais on a le yield return, que vous connaissez peut-être, qui permet de retourner une partie de la réponse, et cela n'est utilisable qu'avec la IEnumerable, donc autre intérêt aussi de cette interface générique. Alors, même si le propos n'est pas d'expliquer yeild return qui a un fonctionnement très particulier puisqu'il interrompt partiellement la fonction et il y revient pour la prochaine itération du foreach, voilà, il faut connaître cette instruction qui est très pratique et qui me permet de retourner le film qui correspond aux critères que j'ai définis. Donc autre utilisation de ma collection générique IEnumerable. On peut maintenant envisager de ne retourner que les films qui ont été faits avant une certaine date. Ici, on pourrait par exemple retourner tous les films qui ont été faits avant maintenant, DateTime.Now. Très pratique aussi ce IEnumerable, pour cela. Alors, il y a beaucoup d'interfaces qu'on pourrait vouloir utiliser. Ici, je vais rajouter un ICollection. Par exemple, mon catalogue est bien une collection de films, c'est cohérent d'en faire un ICollection, ce qui me permettrait de faire des ajouts, des suppressions tout en maîtrisant la façon dont c'est fait, puisque je vais implémenter une interface, mais faciliter le travail du développeur qui va utiliser ma classe puisque, pour lui, ICollection, c'est quelque chose qu’il connaît peut-être ou qu'il utilise ou qui est utilisée par des classes que lui-même utilise. Donc ici une interface, il faut l’implémenter. Là, j'ai lancé l'implémentation. Alors, cela fait beaucoup de méthodes. Ces méthodes peuvent intimider un petit peu au moment de les implémenter. Je vais proposer une implémentation qui est somme toute assez basique puisque je vais réutiliser ma classe films qui a déjà toutes ces méthodes. Donc je ne fais juste que faire un corps de fonction qui appelle films. Je fais par contre le Add en m'assurant qu'il n'y a pas de doublon, avec mon Ajouter que j'avais fait précédemment. Le Count et le IsReadOnly, je ne les ai pas effacés. Ils sont par cela, en rouge. Et donc, avec ICollection, j'ai une façon plus naturelle d'utiliser ma collection tout en respectant les contraintes de ma classe. Donc les interfaces génériques : un bon moyen d’être plus générique au niveau des classes et tout en étant toujours respectueux des contraintes qu'on a, des contraintes métier sur nos classes.

Table des matières