Я уверен, что вы слышали о "всегда предпочитайте композицию наследованию".
Основная идея этого предположения состоит в том, что несколько объектов с различными функциональными возможностями объединяются для создания одного полнофункционального объекта. Это должно быть предпочтительнее, чем наследование функциональности от разрозненных объектов, которые не имеют ничего общего друг с другом.
Основной аргумент в этом отношении содержится в определении Принципа замены Лискова и игриво проиллюстрирован этим плакатом:
![Liskov Substitution Principle: If it looks like a duck, quacks like a duck, but needs batteries - you probably have the wrong abstraction](https://i.stack.imgur.com/XG6k4.jpg)
Если у вас был объект ToyDuck, от какого объекта вы должны наследовать, с точки зрения чисто наследования? Должны ли вы наследовать от утки? Нет - скорее всего, вы должны наследовать от Той.
Суть в том, что вы должны использовать правильный метод абстракции - будь то наследование или композиция - для вашего кода.
Для ваших текущих объектов подумайте, есть ли объекты, которые должны быть удалены из дерева наследования и включены просто как свойство, которое вы можете вызывать и вызывать.