Oui tout à fait, mais les traits vont quand même un cran plus loin.
Les méthodes d'extensions comme les traits permettent de dire : à partir de maintenant, les String ont la méthode wordCount() ; sans cela tu devrais, dans ton code, appeler une méthode statique prenant une String en paramètre (d'ailleurs comme l'explique ton lien il s'agit principalement de sucre syntaxique qui fait cet appel statique à ta place).
En revanche, les traits permettent aussi de faire la chose suivante :
si un code tiers définit le traitWordCount (ayant une méthode wordCount()), ainsi que des fonctions manipulant des objets implémentant ce trait, je peux dans mon propre code dire que les String (définies dans la bibliothèque standard que je ne peux/veux pas modifier) implémentent ce trait, et donc appeler les fonctions de ce code en lui passant directement des String. Ce n'est pas possible en C# de dire que maintenant String implémente l'interface IWordCount.
En C#, tu devrais soit :
dériver de String dans une classe WordCountableString (bon en l'occurrence les String ne sont pas dérivables en C#, mais avec une autre classe ça aurait pu être une possibilité).
créé une classe proxy WordCountableString qui wrappe un objet String.
Mais du coup si du code tiers te génère des objets String, tu devras construire un objet WordCountableString correspondant pour pouvoir les passer aux méthodes attendant des IWordCount ; ce qui alourdit à la fois le code et l'exécution (à cause d'objets supplémentaires 'inutiles').
[^] # Re: Premières impressions
Posté par GuieA_7 (site web personnel) . En réponse à la dépêche Rust 1.0, entrée dans la période stable. Évalué à 4.
Oui tout à fait, mais les traits vont quand même un cran plus loin.
Les méthodes d'extensions comme les traits permettent de dire : à partir de maintenant, les
Stringont la méthode wordCount() ; sans cela tu devrais, dans ton code, appeler une méthode statique prenant uneStringen paramètre (d'ailleurs comme l'explique ton lien il s'agit principalement de sucre syntaxique qui fait cet appel statique à ta place).En revanche, les traits permettent aussi de faire la chose suivante :
si un code tiers définit le trait
WordCount(ayant une méthodewordCount()), ainsi que des fonctions manipulant des objets implémentant ce trait, je peux dans mon propre code dire que lesString(définies dans la bibliothèque standard que je ne peux/veux pas modifier) implémentent ce trait, et donc appeler les fonctions de ce code en lui passant directement desString. Ce n'est pas possible en C# de dire que maintenantStringimplémente l'interfaceIWordCount.En C#, tu devrais soit :
WordCountableString(bon en l'occurrence lesStringne sont pas dérivables en C#, mais avec une autre classe ça aurait pu être une possibilité).WordCountableStringqui wrappe un objet String.Mais du coup si du code tiers te génère des objets String, tu devras construire un objet
WordCountableStringcorrespondant pour pouvoir les passer aux méthodes attendant des IWordCount ; ce qui alourdit à la fois le code et l'exécution (à cause d'objets supplémentaires 'inutiles').