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