User Tools

Site Tools


principles:liskov_substitution_principle

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
principles:liskov_substitution_principle [2013-06-15 15:38] – [Context] 94.217.39.37principles:liskov_substitution_principle [2021-10-18 21:50] (current) – +++ restored +++ christian
Line 17: Line 17:
 ===== Description ===== ===== Description =====
  
-Object-oriented programming languages allow to derive subtypes from base types and subtype polymorphism allows to pass an object of a subtype where ever an object of the supertype is specified. Suppose ''P'' and ''Q'' are types (i.e. classes or ''interface''s) and ''Q'' is derived from ''P'' (so ''Q'' is the subtype and ''P'' is the base type or supertype). A method ''m'' requiring a parameter of type ''P'' can be called with objects of type ''Q'' because every object of type ''Q'' is also an object of type ''P''. This is always true as typically object-oriented programming languages are constructed in that way.+Object-oriented programming languages permit the derivation of subtypes from base typesand subtype polymorphism allows the passing of an object of a subtype where ever an object of the supertype is specified. Suppose ''P'' and ''Q'' are types (i.e. classes or ''interface''s) and ''Q'' is derived from ''P'' (so ''Q'' is the subtype and ''P'' is the base type or supertype). A method ''m'' requiring a parameter of type ''P'' can be called with objects of type ''Q'' because every object of type ''Q'' is also an object of type ''P''. This is always true as typically object-oriented programming languages are constructed in that way.
  
-But the programming language does not enforce that the subtype also behaves like the supertype. Method ''m'' may work with an object of type ''P'' but not with an object of type ''Q''. LSP demands that a subtype (''Q'' in the example) has to be constructed in a way that it behaves like the supertype if it is called through the supertype interface. ''Q'' may have further methods and it may do additional things not observable by ''m'' but ''m'' shall be able to safely assume that its parameter behaves like an object of type ''P'' with respect to all observable state.+The programming language does not enforce that the subtype behaves like the supertype. Method ''m'' may work with an object of type ''P''but not with an object of type ''Q''. LSP demands that a subtype (''Q'' in the example) has to be constructed in a way that it behaves like the supertype if it is called through the supertype interface. ''Q'' may have further methods and it may do additional things not observable by ''m'' but ''m'' shall be able to safely assume that its parameter behaves like an object of type ''P'' with respect to all observable state.
  
  
Line 26: Line 26:
 ===== Rationale ===== ===== Rationale =====
  
 +Let ''P'' and ''Q'' be types and ''Q'' a subtype of ''P''. If LSP is not adhered to, there is an operation accessible through the interface of ''P'' which behaves differently when called on ''Q''. So code which is written in terms of ''P'' will not expect the behavior and will not work as desired.
 ===== Strategies ===== ===== Strategies =====
  
   * Only strengthen invariants in subclasses; never weaken them   * Only strengthen invariants in subclasses; never weaken them
-  * Only waken preconditions when overriding methods+  * Only weaken preconditions when overriding methods
   * Only strengthen postconditions when overriding methods   * Only strengthen postconditions when overriding methods
   * Use Delegation instead of Inheritance   * Use Delegation instead of Inheritance
Line 81: Line 81:
 ===== Description Status ===== ===== Description Status =====
 /* Choose one of the following and comment out the rest: */ /* Choose one of the following and comment out the rest: */
-[[wiki:Stub]] +/*[[wiki:Stub]]*
-/*[[wiki:Incomplete]]*/+[[wiki:Incomplete]]
 /*[[wiki:Complete]]*/ /*[[wiki:Complete]]*/
  
Line 94: Line 94:
   * Barbara H. Liskov , Jeanette M. Wing: //[[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.1223|A Behavioral Notion of Subtyping]]//   * Barbara H. Liskov , Jeanette M. Wing: //[[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.1223|A Behavioral Notion of Subtyping]]//
   * Barbara H. Liskov , Jeanette M. Wing: //[[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.28.2615|Behavioral Subtyping Using Invariants and Constraints]]//   * Barbara H. Liskov , Jeanette M. Wing: //[[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.28.2615|Behavioral Subtyping Using Invariants and Constraints]]//
 +
 +===== Discussion =====
 +
 +Discuss this wiki article and the principle on the corresponding [[talk:principles:Liskov Substitution Principle|talk page]].
 +
principles/liskov_substitution_principle.1371303502.txt.gz · Last modified: 2013-06-15 15:38 by 94.217.39.37