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