... Single inheritance
Imagine you are hired in a company but they have this rule that nobody can walk more than 3 steps in one direction so you have to rotate 90 degrees, also you can't cross the path you have travelled already. Now everyone comes up with contrived and ridiculous strategies to get to the restroom, cafetaria, and kitchen. That's what design patterns are, at least lot of them.
They are simply strategies to mitigate the limitations of Static typing. For example Factory Pattern, Facade, Decorator, Adapter, ...
Now definitely not the case for ALL design patterns but I do think many are. It's kinda sad when you entire program is simply a fight against types.
Coming from Ruby and Javascript land this seems very stupid.
I don't need to make 10 abstract classes, 10 interfaces and overload, underload, sideload (lol) same functions.
The main pain point seem to be you have only one chain of inheritance.
What we do these days for JS seems to be the simplest solution. Import whatever functionality you need, run the function, and be done with it. No point in defining entire world in terms of single inheritance. Simply compose what you need.
It's my opinion OOP with Static typing results in very contrived code that is half solving the technical problem and half fighting its limitations. Oh but that autocomplete.
I used typescript. I didn't care much for abstract blabalba. But I really liked being able to define input and output in strict terms. Which is like JS docs but more enforced. VScode works great with it.