13 votes

Le principe de substitution de Liskov s'applique-t-il au sous-type hérité d'une classe abstraite ?

Au sens large, le principe de substitution de Liskov stipule qu'une classe dérivée peut être substituée à la classe de base sans que cela n'affecte l'utilisateur. Dans le cas où la classe de base est une classe abstraite, ce qui signifie qu'aucun utilisateur n'utilise une instance de la classe de base, les restrictions d'héritage de Liskov s'appliquent-elles toujours à la classe dérivée ?

7voto

tvanfosson Points 268301

Ce n'est pas parce que vous ne pouvez pas instancier une classe particulière que vous ne pouvez pas l'utiliser. Dans ce scénario, le code appelant utilise la classe de base abstraite comme définition du contrat dans lequel il opère. En ce sens, chaque classe qui dérive de la classe de base devrait être interchangeable par rapport à l'interface définie par la classe de base, donc oui Liskov s'applique toujours. En fait, c'est l'une des principales raisons pour lesquelles vous voudriez avoir une classe de base abstraite pour une collection de classes qui ont un comportement commun - ainsi vous pouvez définir des opérations en termes d'interface de la classe de base et ne pas vous soucier de la classe dérivée sur laquelle vous opérez réellement.

1voto

Jeff Sternal Points 30147

Oui, car un appelant peut toujours le faire :

BaseAbstractClass instance = new DerivedClass();

0voto

David Gladfelter Points 2756

Les classes abstraites ne sont pas du tout en conflit avec LSP. Beaucoup de gens considèrent que l'utilisation de "new" directement à partir du code client est une violation de l'esprit de LSP. Si vous instanciez et utilisez un objet, vous êtes étroitement lié à cette implémentation, et vous ne pouvez pas du tout le "substituer".

Envisagez la création de l'objet via une usine ou en tant qu'argument ou via l'injection de dépendances après avoir été créé par une sorte de référentiel qui peut se concentrer sur la prise de décisions concernant les types concrets nécessaires dans diverses circonstances.

0voto

Jerry Coffin Points 237758

En bref, oui. Le PSL s'applique essentiellement à tous l'héritage public. Le fait qu'une classe de base soit abstraite n'y change rien. La classe de base définit une interface, et tous les dérivés légitimes doivent satisfaire à toutes les exigences de cette interface.

0voto

lance Points 6325

Oui.

Voir la section "Un exemple concret" (page 7-8) de l'ouvrage Article de l'Oncle Bob sur le principe de substitution de Liskov .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X