Contents
Meta
—
* still in an early stage
—
* still in an early stage
“Subtypes must be substitutable for their base types.”1)
Object-oriented programming languages permit the derivation of subtypes from base types, and 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.
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.
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.
See section contrary principles.
Barbara Liskov: Data abstraction and hierarchy
protected
features for subclasses in general. But it should be inherently clear that subclasses in general may need this functionality without looking at a particular one.Discuss this wiki article and the principle on the corresponding talk page.