Quelle est la différence entre :
Liste<MonType> maListe ;
y
maListe : Liste<MyType>
Il est évident que le premier est une liste et le second une classe. Mais ma question est de savoir quel est l'avantage du second par rapport au premier.
Quelle est la différence entre :
Liste<MonType> maListe ;
y
maListe : Liste<MyType>
Il est évident que le premier est une liste et le second une classe. Mais ma question est de savoir quel est l'avantage du second par rapport au premier.
Cette dernière vous donne la possibilité d'avoir une fonction qui prend une myList, au lieu d'une simple liste. Cela signifie également que si le type de myList change (par exemple en une liste triée), vous n'avez pas besoin de modifier votre code. Ainsi, au lieu de déclarer List<myType>
partout, et ensuite devoir les changer, si vous aviez MyList
des objets partout, vous êtes en or.
C'est aussi une différence syntaxique. Est-ce que maListe tienen une liste, ou c'est une liste ?
Je pencherais plutôt pour un MyList : List<MyType>
s'il est utilisé couramment dans votre programme.
Liste<MonType> maListe est une instance du type générique Liste qui peut contenir des éléments de MonType (ou de tout type dérivé de MonType).
var myTypeInstance = new MyType();
var myList = new List<MyType>;
myList.Add(myTypeInstance);
myList : Liste<MyType> est un nouveau type qui hérite de List, dont vous pouvez ensuite créer des instances multiples :
var myTypeInstance = new MyType();
var myCollectionVariable = new myList();
myCollectionVariable.Add(myTypeInstance);
Le principal avantage de cette dernière par rapport à la première est que si vous voulez avoir des méthodes qui agissent sur une liste, vous pouvez les mettre dans votre classe, plutôt que de les stocker dans une bibliothèque "helper" ou "utility", par exemple :
class myList : List<MyType>
{
public void DoSomethingToAllMyTypesInList()
{
...
...
}
}
Cette dernière est une nouvelle classe qui hérite de la base, mais qui est distincte. La distinction la plus évidente est qu'elle n'a pas les mêmes constructeurs, mais vous rencontrerez également des problèmes de streaming.
Ce sont les inconvénients. L'avantage est que vous pouvez ajouter certaines de vos propres méthodes. Même dans ce cas, j'envisagerais d'utiliser le confinement, avec la relation has-a au lieu de is-a.
Je préférerais ne pas hériter de l'implémentation lorsque cela est possible. Elle a son utilité, mais si elle n'est pas entièrement nécessaire, alors elle n'en vaut pas la peine.
La réponse principale à votre question est qu'en héritant List<T>
vous rendez toutes ses méthodes publiques par défaut. En général, lorsqu'on écrit une nouvelle classe, on veut l'encapsuler. Vous ne voulez pas laisser fuir les données internes. Par exemple, supposons que vous vouliez créer un conteneur thread-safe. Si vous héritez d'un conteneur thread-ignorant, vos clients seront en mesure d'utiliser l'interface publique de la classe de base pour contourner tout verrouillage que vous essayez de mettre en place.
Une autre erreur courante consiste à utiliser souvent un type de conteneur particulier. Il est alors tentant d'essayer d'utiliser l'héritage pour lui donner un nom court :
class ShortName : Dictionary<string, List<string>> { };
Mais ce n'est pas ce que vous avez fait - vous avez créé un type complètement nouveau. Cela signifie que si vous disposez d'une autre bibliothèque capable de produire la bonne structure de données, elle ne sera pas directement utilisable par votre code ; vous devrez la copier dans un fichier ShortName
première. Un exemple est Linq, qui peut facilement construire une Dictionary<string, List<string>>
d'une expression très lisible et fonctionnelle, se terminant par ToDictionary
.
Alors à la place, faites ça :
using ShortName = Dictionary<string, List<string>>;
Vous disposez maintenant d'un alias court et rapide pour le fastidieux typename, mais vous utilisez toujours le même type.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.