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 ?
Réponses
Trop de publicités?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.
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.
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 .