наследование может выполнять две вещи:
1) субтипирование, subtyping - это то, без чего в ООП нельзя. Это ОК
2) code reuse - это совсем не ОК
Эти две вещи технически выглядит как наследование. Я применяю только первое. Второе я не использую никогда (за исключением случаев когда на работе говорят что нужно сделать еще вчера) - если вкратце, то вместо этого хорошо подходят вертикальные декораторы, про них можно почитать например тут
https://www.yegor256.com/2015/10/01/vertical-horizontal-decorating.html