Наследование является хорошим инструментом для правильной ситуации, но часто используется слишком часто.
Предпочитая композицию наследованию, вы получаете возможность менять реализации на лету. Например, вы можете составить класс, предоставив ему интерфейс, обеспечивающий поведение. Если этому классу нужны 2 разные реализации для разных ситуаций, у вас есть такая свобода. Однако, если бы вы использовали наследование, то у вас все равно было бы поведение вашего суперкласса, и вам пришлось бы переопределить его в куче мест. По сути, композиция - гораздо более гибкая модель для создания объектов.