<i>The Structure and Interpretation of Computer Programming</i> has a very relevant comment about this exact topic:<p><i>Developing a useful, general framework for expressing the relations among different types of entities (what philosophers call ``ontology'') seems intractably difficult. The main difference between the confusion that existed ten years ago and the confusion that exists now is that now a variety of inadequate ontological theories have been embodied in a plethora of correspondingly inadequate programming languages. For example, much of the complexity of object-oriented programming languages -- and the subtle and confusing differences among contemporary object-oriented languages -- centers on the treatment of generic operations on interrelated types.</i><p>Ouch. This was written in 1996, but I don't think that languages like Java and Ruby have changed the state of the art that is being discussed. See <a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html#footnote_Temp_289" rel="nofollow">http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html...</a> for the full context of this quote. (I was quoting from footnote 52.)<p>In an odd unrelated note, I've noted that there is some correlation between people's opinions on object oriented programming and how they eat corn. See <a href="http://bentilly.blogspot.com/2010/08/analysis-vs-algebra-predicts-eating.html" rel="nofollow">http://bentilly.blogspot.com/2010/08/analysis-vs-algebra-pre...</a> for more on this.