Le principe de substitution de Liskov s'applique-t-il également aux classes implémentant une interface?

17

LSP indique que les classes doivent être substituables à leurs classes de base, ce qui signifie que les classes dérivées et de base doivent être sémantiquement équivalentes.

Mais LSP s'applique-t-il également aux classes implémentant une interface? En d'autres termes, si une méthode d'interface implémentée par une classe est sémantiquement différente de ce que l'utilisateur attend qu'elle soit, cela serait-il considéré comme une violation de LSP?

user1483278
la source
7
Oui. Exactement les mêmes raisons et résultats que la violation de LSP s'il s'agit d'une interface, d'une classe abstraite, d'une classe complète, n'a pas d'importance. Le LSP consiste à définir et à répondre aux attentes pour permettre aux consommateurs de traiter vos types de manière générale.
Jimmy Hoffa
5
Dans l'ensemble (je connais les différences, mais je généralise ici), les interfaces sont quelque peu analogues aux classes abstraites pures (terme C ++) et donc Liskov devrait s'appliquer aux interfaces et aux classes qui les mettent en œuvre.
Jesse C. Slicer
3
NB la formulation du LSP que je connais parle de sous-types plutôt que de classes dérivées et de base. Avec raison, je suppose, car aucune des raisons n'est spécifique à l'héritage et s'applique aussi bien à tout autre type de sous-typage.

Réponses:

17

si une méthode d'interface implémentée par une classe est sémantiquement différente de ce que l'utilisateur attend d'elle, cela serait-il considéré comme une violation de LSP?

Si l'implémentation est sémantiquement différente du comportement documenté à travers les invariants de l'interface et les pré et post-conditions de ses méthodes, alors la réponse est "oui", ce serait une violation du LSP. Le principe établit les règles pour l'abstraction et ses implémentations, sans exiger que le côté abstraction soit présent sous la forme d'une classe.

Cependant, si nous parlons de ce que les utilisateurs attendent , la réponse serait "pas nécessairement": les utilisateurs ont le droit d'avoir des attentes erronées.

dasblinkenlight
la source
"Si l'implémentation est sémantiquement différente du comportement documenté par les invariants de l'interface" Pourriez-vous préciser ce que vous entendez par "invariants de l'interface"?
user1483278
3
@ user1483278 Voici un article sur les invariants de type . L'article les appelle «invariants de classe», mais la description s'applique également aux interfaces. Les invariants sont des conditions établies lors de la construction et maintenues tout au long de la durée de vie d'une instance. Par exemple, si une interface a une propriété Namequi ne peut pas être définie sur null, alors elle obj.Name != nullest considérée comme un invariant de cette interface.
dasblinkenlight
1
Généralement, lorsque les invariants sont discutés, il est possible d'écrire un morceau de code pour vérifier que l'invariant est maintenu pendant toute la durée de vie de l'objet. Cependant, il est généralement plus simple de décrire verbalement l'invariant en anglais simple.
rwong