Now it's Eric's turn to open up a cans of worms, this time over whether methods should default to be virtual or final. Here are links to his posts (so far) on the topic.

As usual, much of the good stuff is in the comments, including this one which I just had to reproduce in full:

re: More on virtual by default 5/18/2004 9:31 AM Richard Curzon

Mom said "don't run with scissors". Some people by nature, they just seem to NEED to run with scissors. It's not that they don't cut themselves... they're proud of the scars!

We've learned rules about running with scissors in software.

The original Design Patterns book cautioning to prefer delegation over inheritance, if we want to keep maintenance effort predictable and minimal. In cases where we want to use inheritance, understand the ways the design becomes fragile. How to carefully design for safe extensibility.

Booch cautioning that encapsulation is a fundamental principle of good software design, but that there is a "tension" between inheritance and encapsulation. Again, how to carefully design for extensibility to avoid the famous "fragility" of inheritance.

Eric's comments are completely in line with the Moms Rules of software.

Still, there will still be lots of people looking for more ways to make bigger and brighter colored scars.

Thump thump thump, oops, OUCH! Thump thump thump, oops, OUCH! Thump thump thump, oops, OUCH! <big grin>

I'm currently caught between (a) no default, to force the developer to decide each time as it is a non-trivial decision; and (b) opting for safety over convenience with final by default. I guess, though, one concession towards convenience might be the ability to mark a class as virtual, making it virtual by default (I don't think that has any existing meaning in C#). This would give the following:

Class Method
virtual final none (i.e. default)
virtual virtual (with warning) final virtual
sealed error final (with warning) final
none (i.e. default) virtual final final

The abstract keyword would be unchanged, and could apply to virtual or 'default' classes.

Does this seem reasonable, or have I missed something fundamental?