My first 12 years of using OOP was plagued with some of the same problems with these OOP promises, no matter what the language. It wasn’t until I learned how to properly apply SOLID design principles that I learned to avoid the most common pain points in software design.
There is of course more up front work, but reuse in other projects was incredibly high, and unit-testability was the highest I’ve seen. In the several years since, going back to regular OOP without using SOLID is like a maintenance nightmare.
It’s a perfect match with C#, but I’ve applied it to C++, Java and Objective-C as well. Pair that with MVC or MVVM and you can build the most complex software with simple, straightforward code.
I once had a colleague that always said “inheritance for the sake of code reuse is evil”. It takes a while to beat that out of the head of an OOP programmer, but I now believe it to be true.