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