Jonathan Rees writes a list of the different features which are commonly associated with the term "object oriented" and points out that definitions of OO include varying subsets of the list. See http://paulgraham.com/reesoo.html for the full text.
The features are (quoting Rees here):
-
Encapsulation - the ability to syntactically hide the implementation of a type.
-
Protection - the inability of the client of a type to detect its implementation.
-
Ad hoc polymorphism - functions and data structures with parameters that can take on values of many different types.
-
Parametric polymorphism - functions and data structures that parameterize over arbitrary values.
-
Everything is an object - all values are objects.
-
All you can do is send a message = Actors model - there is no direct manipulation of objects, only communication with (or invocation of) them.
-
Specification inheritance = subtyping - there are distinct types known to the language with the property that a value of one type is as good as a value of another for the purpose of type correctness.
-
Implementation inheritance/reuse - having written one pile of code, a similar pile (e.g. a superset) can be generated in a controlled manner, i.e. the code doesn't have to be copied and edited. A limited and peculiar kind of abstraction.
-
Sum-of-product-of-function pattern - objects are (in effect) restricted to be functions that take as first argument a distinguished method key argument that is drawn from a finite set of simple names.
Because OO is a moving target, OO zealots will choose some subset of this menu by whim and then use it to try to convince you that you are a loser. -- Jonathan Rees
See also DefinitionsOfOoConsideredHarmful