If upon implementation it turns out two classes in the design share common code, the common code should move into a new superclass. This process is called generalization. Second, if derived classes are consistently overriding the methods of their parent class, or if overriding one method forces the developer to override another method, the parent class should be broken up to move the offending methods into a new subclass of the parent. This second process is called specialization. Capturing instances of classes as new classes.
Designers often capture an instance of a class as a new class.
This error has two unfortunate side effects. First, there will be many unnecessary classes. Second, you will almost immediately think you need multiple inheritance to solve the problem. Figure 5 Avoid useless multiple inheritance with composition. A designer can judge the appropriateness of a particular inheritance hierarchy by evaluating the design on two points.