web-dev-qa-db-fra.com

Comment le renforcement des conditions préalables et de l'affaiblissement des postconditions violent le principe de substitution de Liskov?

J'ai lu cela principe de substitution de Liskov est violé si:

  1. Les conditions préalables sont renforcées, ou

  2. Les postconditions sont affaiblies

Mais je ne suis pas encore complètement de la manière dont ces deux points violeraient le principe de substitution de Liskov. Quelqu'un peut-il s'il vous plaît expliquer avec un exemple. Plus précisément, comment l'une des conditions ci-dessus pourrait-elle causer une situation dans laquelle un objet de sous-classe ne peut pas être substitué à un objet de superclasse?

19
Geek
  1. Supposons que votre BASECLASS fonctionne avec un membre INT. Maintenant, votre sous-type nécessite que INT soit positif. Ceci est renforcé les pré-conditions, et maintenant n'importe quel code qui a fonctionné parfaitement bien avant que des INT négatifs soient cassés.

  2. De même, supposez le même scénario, mais la classe de base utilisée pour garantir que le membre serait positif après avoir été appelé. Ensuite, le sous-type change le comportement pour permettre aux INT négatifs. Code qui fonctionne sur l'objet (et suppose que la situation positive est une INT positive) est maintenant cassée car la condition postérieure n'est pas confirmée.

Celles-ci sont bien sûr des exemples triviaux, mais le concept tient. Des trucs comme laisser une connexion de fichier/base de données ouverte est un exemple de post-condition atténuée qui conduit à des problèmes.

30
Telastyn

enter image description here

Invariant - Modèle de SelfDrivingveHicle qui restent inchangés dans tous les sous-types, c'est-à-dire l'ordre dans lequel il exécute les comportements remplacés pour atteindre la destination.

Permet de supposer une autre méthode ici

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

Conditions préalable - SelfDriveVeHicle Le type de base n'a aucun véhicule (ici, le contexte est ajout) et sa condition préalable affaiblie qui ne peut être modifiée par aucun de ses types de types en modifiant les véhicules de propriété et en renforçant explicitement. L'un des sous-types ne peut invoquer que l'ajout.

PostCondition - Une fois l'ajout de type de base invoqué est en postcondition renforcée qui ne peut pas être affaiblie par des sous-types en modifiant la valeur des véhicules.

L'état du type de base revient à son état d'origine une fois que le comportement Ajout est invoqué.

1
Vishal Patwardhan