Question

J'essaie généralement de m'assurer que mes instances d'objet respectent Principe de substitution de Liskov, mais je me suis toujours demandé si les gens pensent que le LSP devrait aussi s'appliquer aux constructeurs?

J'ai essayé de googler pour cela, mais je n'ai pas pu trouver d'opinions fortes de toute façon.

Je dois noter que la plupart de mon codage est dans Ruby, mais je trouve parfois que mes constructeurs de sous-classe sont légèrement différents de la classe parent. Ils prennent le même ensemble d'arguments de base, et souvent des args supplémentaires. Parfois, cela se produit également avec d'autres méthodes de classe.

À l'arrière de ma tête, cela a toujours été comme une violation du LSP, mais je voulais voir si quelqu'un d'autre le ressent aussi.

Était-ce utile?

La solution

Non, lorsque vous utilisez un constructeur, vous savez que vous avez affaire au sous-type. Cela vous permet d'avoir des conditions préalables non requises pour le constructeur parent tel que d'autres paramètres. C'est pourquoi dans la plupart des langues, le nom du constructeur est celui de la classe créée.

Un bon exemple de la façon dont c'est un ColoredSquare pourrait être un sous-type approprié de Square, mais nécessite un paramètre supplémentaire: color. Si vous ne pouviez pas faire des choses comme ces sous-types serait beaucoup moins utile.

Dans un certain sens, le constructeur ne fait pas vraiment partie du type: c'est une fonction qui renvoie un élément de ce type. Ainsi, définir un nouveau constructeur pour un sous-type, ne casse pas le LSV.

Autres conseils

Définitivement non.

Les constructeurs sont normalement spécialisés pour les sous-types. Essayer d'appliquer LSP aux constructeurs serait comme dire que des sous-types ne peuvent pas avoir ajouté des méthodes ou des membres spécifiques. Mais la restriction n'est que l'inverse.

Et je suis également d'accord avec Philip, les constructeurs ne font pas vraiment partie d'un type (et dans certaines langues, vous pouvez facilement utiliser d'autres usines au lieu de constructeurs). En utilisant la terminologie SmallTalk, vous diriez que les constructeurs sont des méthodes de méta-classes.

Aucune violation de LSP ici, elle ne s'applique qu'aux méthodes d'instance, et non aux méthodes de classe (constructeurs ou autres méthodes de classe).

C'est une sorte de question d'opinion, mais la façon dont j'ai tendance à écrire le mien est telle que les paramètres supplémentaires n'ont pas de véritable incidence sur les fonctionnalités changeantes. J'entends par là que lorsque mon constructeur nécessite un paramètre supplémentaire dans une sous-classe, il s'agit de maintenir la fonctionnalité standard (mais de faire différentes choses sous-jacentes) de cette façon, disons que je crée classa = new ClassB (avec certains args); alors les fonctionnalités sont les mêmes que je fasse ceci ou classa = new classa (); Et j'utilise généralement une sorte de méthode d'usine pour les créer, donc c'est transparent dans la façon dont ils fonctionnent. Encore une fois, c'est comme ça que je fais les choses et n'est en aucun cas la manière absolue correcte de faire les choses.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top