I think you are totally wrong in contradicting my point. Though what you say (other than your statement that I am wrong) doesn’t contradict what I am saying.
You don’t have to only use interfaces to write proper OOP code. Inheritance isn’t to avoid rewriting code - if that is the case then you should use composition - but inheriting an object just so you don’t have to rewrite or to implement functionality you don’t want to rewrite completely destroys the design.
Think of it - you are providing access to your super where it doesn’t make sense - if inheritance doesn’t make sense and you are only doing it to avoid boilerplate code - this is exactly what you are doing. What if you have a class called Door, that has the method ‘attack’ and ‘getHealth’ inherited from it’s super because you inherited GamePlayer so you wouldn’t need to rewrite some entity management code. That’s an extreme example I admit but it makes the point that inheritance is not to avoid boilerplate code. Only inherit when it makes sense.
If something is not a game character, don’t inherit it.
If something is not an entity (but you want access to something implemented in Entity) don’t inherit entity.
If you are writing a class door, it makes sense to inherit Actor which inherits Entity because a door is an entity, and a door is an actor (entity with visual representation - i.e an ‘actor’ in the world)
Once you get something like ‘door’ you’ve essentially reached a point where you want to look into sealing the class - since it doesn’t make sense to inherit from something as specialized as a door.
When we start talking about private inheritance and protected inheritance (which doesn’t exist in Java - but does in i.e C++) that’s a whole other story since you aren’t exposing the object as an instance of what you are inheriting - so there isn’t a door open for misuse.