Salut !
J'ai vu qu'en C# on pouvait écrire des extensions pour des classes qui ne seraient pas héritables/dérivables, ce qui m'a fait réfléchir à la question : mais pourquoi est-ce que je décidrais que ma classe personne ne devra en hériter ?
Salut !
J'ai vu qu'en C# on pouvait écrire des extensions pour des classes qui ne seraient pas héritables/dérivables, ce qui m'a fait réfléchir à la question : mais pourquoi est-ce que je décidrais que ma classe personne ne devra en hériter ?








Hello,
Le danger avec l'héritage (et surtout la surcharge) c'est d'altérer une propriété implicite de la classe mère et d'aboutir à des bugs.
Un exemple bien connu d'héritage défectueux est de faire dériver une classe Carré d'une classe Rectangle. Si le setter de Carre.Hauteur est redéfini dans la classe Carré pour systématiquement fixer la Largeur à la même valeur (puisqu'un carré doit toujours avoir les côtés de même longueur), on a une propriété du Rectangle qui est violée, à savoir :
Un consommateur de Rectangle s'attend à ce que
Cette propriété n'est plus respectée si on passe à ce consommateur de Rectangle un Carré tel que défini précédemment puisque la surface vaudra dans les faits x*x et non plus x*y.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 r.Largeur = y; r.Hauteur = x; r.Surface // doit toujours retourner x*y
Bien sûr c'est un exemple basique mais il est d'autant plus valable pour des bases de code plus complexes. Donc pour éviter la tentation qu'aurait un autre développeur d'hériter de notre classe et de surcharger son comportement, en craignant qu'il puisse mal la surcharger, on scelle la classe. On voit ça parfois dans des bibliothèques ou frameworks.
Une classe scellée peut aussi être plus performante. Cf https://docs.microsoft.com/en-us/dot...elines/sealing
J'ai toujours été totalement contre cette mode du private et du sealing de classes en POO, car pour moi cela va à l'encontre d'un des 3 piliers de la POO : la réutilisabilité.
Et on en manque tellement en développement de réutilisabilité. Mais ca redevient à la mode avec des frameworks de type composants.![]()








En quoi sceller une classe empêche de la réutiliser ?
Tu ne peux pas modifier son comportement, ce qui limite quand même fortement sa réutilisation. La capacité à hériter est une grande partie de la réutilisation des classes.
Le concepteur d'une classe ne sait pas tout ce que d'autres voudront faire avec sa classe, d'où l'intérêt pour moi de laisser ouvert au maximum en POO.
Rien de plus frustrant d'être bloqué, comme il y a quelques années en DotNet, sur une classe de Microsoft complètement Sealed et en plus de ne pas en avoir le code source.








Comme je le disais, c'est compréhensible de vouloir empêcher qu'on hérite de sa classe si on craint que les gens ne surchargent en violant des préconditions et invariants.
Et il vaut souvent mieux utiliser la composition que l'héritage pour réutiliser de l'existant. L'idée, c'est que plutôt que de bidouiller un truc qui existe via l'héritage, on va s'en servir tel quel et adapter le résultat qu'il nous retourne.
Partager