Normes 101 – De l’usage des classes sealed en C#
C’est bien beau de ne pas parler des dessous de la robe de la mariée, mais est-ce vraiment utile ? Lire ci-dessous pour la suite.
Une classe sealed est une classe qu’on ne peut dériver :
public MaClasse : UneClasseSealed
{
}
Ce bout de code ne compile pas. Si UneClasseSealed est effectivement sealed (scellée), rien à faire, on ne peut la dériver.
Bon, c’est bien beau, mais à quoi ça sert ?
Vous remarquerez dans le framework .NET que certaines classes de WinForm et de ADO.NET sont scellées. La raison en est simple : ces classes supposent certaines optimisations systèmes, lesquelles optimisations ne seraient pas possibles s’il s’agissait de classes héritables. En particulier, les classes scellées apparaissant sous Winform n’implémentent que des appels directs à Win32. Allez brancher les vôtres dans ce contexte et vous fouterez sans doute un joli bordel.
Cela dit, hormis les optimisations mises en place par le constructeur, quand devrions-nous utiliser des classes scellées ?
La réponse est toute simple : le plus souvent possible ! En effet, mieux vaut déclarer par défaut une classe sealed que l’inverse pour la simple et bonne raison que l’héritage est un mécanisme qui ne s’improvise pas (il suppose en particulier que l’interface de votre classe soit à peu près définitive le jour de sa publication). Si vous ne construisez pas sciemment vos classes pour être héritables, mieux vaut les sceller d’abord, quitte à les rouvrir ensuite mais en toute connaissance de cause.
Imaginez : vous créez une classe à la va-vite avec la ferme intention d’y revenir dès que possible (ça arrive tous les jours). Or, le jour où vous décidez d’entreprendre sa refonte, vous vous apercevez que 3 collègues ont créé des classes dérivées de la vôtre… La portée de vos modifications est soudainement décuplée, tant et si bien que cette refonte, qui s’annonçait cool, risque d’être remise à plus tard. Ou même, comme c’est souvent le cas, de n’être jamais entreprise.
Il est dommage que les créateurs de C# n’aient pas scellé par défaut toutes les classes.