默认情况下,C# 中的方法是非虚拟的。This answer to another question解释了这样做的好处:
应该为继承设计类以便能够利用它。默认情况下拥有虚拟方法意味着类中的每个函数都可以插入并被另一个函数替换,这并不是一件好事。
甚至 Anders Hejlsberg似乎也给出了同样的理由:
当我们在 API 中发布一个虚方法时,我们不仅承诺当你调用这个方法时,x 和 y 都会发生。我们还承诺,当您覆盖此方法时,我们将按照与其他方法相关的特定顺序调用它,并且状态将保持不变。[...] 您不希望用户在 API 中的任意点覆盖和挂钩,因为您不一定会做出这些承诺。
我同意这个推理:通常当我创建一个非私有方法时,我只想创建可以从类外的某个地方调用的代码。通常,不会考虑其他人如何覆盖此方法以及会产生何种影响。对于特殊情况,我可以用virtual
信号来表示确实以覆盖有意义的方式创建了代码。
但是,默认情况下类仍然是未密封的。默认假设我花费了额外的精力来确保继承一个类是有意义的。
在这方面,有什么东西使类与方法不同吗?
编辑
我真的不知道如何改变搁置 - 基于意见的事情。我从不征求意见。也许我必须明确地说出来?
我不想发表意见。
一个正确的答案要么提供一个类与方法不同的例子,要么说明在这种情况下没有区别。