Bernard Sumption has a post titled Inheritance is evil, and must be destroyed: part 1:
All of the pain caused by inheritance can be traced back to the fact that inheritance forces 'is-a' rather than 'has-a' relationships. If class R2Unit extends Droid, then a R2Unit is-a Droid. If class Jedi contains an instance variable of type Lightsabre, then a Jedi has-a Lightsabre.
The difference between is-a and has-a relationships is well known and a fundamental part of OOAD, but what is less well known is that almost every is-a relationship would be better off re-articulated as a has-a relationship.
I couldn't have said it better myself. Remember that next time you type
extends and re-think the implementation before taking the easy route. Unless, of course, you just want to be like Java ;-)