But my question is: what is missing from the OO side? What would it take for C# and/or others to "do OO well"?
But my question is: what is missing from the OO side? What would it take for C# and/or others to "do OO well"?
As for what C# could do better, the OO solution to the problem pattern matching solves is multiple dispatch - with single dispatch languages you need things like the visitor pattern. Making that a first class part of C# would be fantastic.
https://shawnhargreaves.com/blog/visitor-and-multiple-dispat...
Multiple inheritance. (j/k)
Having "interfaces" and "abstract classes" is just a kludge, multiple inheritance covers all of this with one language construct.
The "diamond problem" is a C++ issue, every other language solved it.
https://learn.microsoft.com/en-us/dotnet/csharp/advanced-top...
CLOS and Ocaml figured it out
Also C++ has exactly what you want. No interfaces, multiple inheritance. People don't utilize it unless it's a GUI lib.