What you need to distinguish is the difference between “implementation inheritance”*(1)* (extending a concrete or abstract class) and “type inheritance”*(2)* (implementing an interface).
(1) can be easily misused and lead to deep and brittle class hierarchies, while (2) is more flexible, because it describes roles or traits of your type, doesn’t force you to inherit implementation details and is to be preferred.