There’s a trend in object-oriented design to favor aggregation over inheritance. Allen Holub’s article "Why extends is evil" describes the problems with inheritance well.
The biggest problem with inheritance is it creates a tight coupling between a parent class and its descendant classes. We’re all taught back in Programming 101 to encapsulate implementation details into functions and methods with well defined interfaces. Later, we can change the implementation details without having to worry about breaking the rest of our code as long as we don’t change the interfaces.
But inheritance has a way of creeping in and destroying this encapsulation. So, you might change an implementation detail of a base class method without changing its interface or semantics at all, and in the process, you might badly break a subclass. In other words, you can’t safely change a base class without first understanding the impact of the change on all of its subclasses.
Anthony W. Ulwick offers a commonsensical approach to understanding the criteria for making customers successful in his book, "What Customers Want." His methodology calls for the gathering of jobs and desired outcomes through a series of interviews with customers. The challenge is that we don’t always know how to get that kind of information nor do we have the skill to navigate an interview towards our desired goals. Here, I offer some tips for making your interviews productive.