Bonjour,
Je me demande l'intérêt d'un mot clé de type 'final' ? Le problème n'est pas ce qu'il peut signifier syntaxiquement : qu'une classe ne peut plus être dérivée ou qu'une fonction virtuelle ne puisse plus être spécialisée. Mais dans quel cas il est intéressant de 'figer' ainsi l'héritage ?
C'est une notion qui existe dans d'autres langages (final en java, sealed en C#), et qui va être introduite en C++0x avec les attributs. Donc je me dis que ça doit certainement avoir un intérêt. Le seul avantage qui me vienne spontanément est lié à des histoires d'optimisation où on peut s'appuyer dessus pour remplacer des résolutions dynamiques d'appels par des résolutions statiques.
En lisant Penser en Java, (passons sur le final sur des variables qui sont l'équivalent d'un const), final pour une méthode est vraiment présenté dans un objectif d'optimisation (et d'inlining). L'argumentation pour une classe est assez ténue et remet en avant l'idée d'optimisation.
Si on ne veut pas qu'une classe serve de base à l'héritage (public), alors aujourd'hui on définit un destructeur public et non virtuel. C'est vrai que c'est implicite et que ça n'empêchera pas quelqu'un de faire quand même un héritage. Dès qu'une classe a une fonction virtuelle (à fortiori un destructeur virtuel public), on conçoit cette classe comme pouvant servir de base à l'héritage. Pourquoi à un moment vouloir figer ce comportement ?
Mais là où j'ai vraiment du mal à voir un intérêt, c'est final sur une méthode.
J'aimerais savoir si c'est une notion qui vous manque. Si vous avez des exemples où elle est utile et même nécessaire.
Partager