c# - 我应该将所有方法标记为虚拟吗?

标签 c# java methods virtual-functions

在 Java 中,您可以将方法标记为 final 以使其无法覆盖。

在 C# 中,您必须将方法标记为虚拟方法以使其可以覆盖。

这是否意味着在 C# 中您应该将所有方法标记为虚拟(除了一些您不想被覆盖的方法),因为您很可能不知道您的类可以通过何种方式被继承?

最佳答案

In C# you have to mark method as virtual to make it possible to override. Does it mean that in C# you should mark all methods virtual (except a few ones that you don't want to be overridden), since most likely you don't know in what way your class can be inherited?

没有。如果语言设计者认为 virtual 应该是默认设置,那么 它应该是默认设置

可覆盖性是一个特性,与所有特性一样,它也有成本。可覆盖方法的成本相当高:设计、实现和测试成本很高,特别是如果对类有任何“敏感性”;虚拟方法是将未经测试的第三方代码引入系统的方法,会产生安全影响。

如果你不知道你打算如何继承你的类,那么不要发布你的类,因为你还没有完成它的设计。你的可扩展性模型绝对是您应该提前知道的;它应该深刻地影响您的设计和测试策略。

我主张所有类密封,所有方法非虚拟,直到你有一个真正的客户为中心的理由来解封或使方法虚拟.

基本上你的问题是“我不知道我的客户打算如何消费我的类(class);因此我应该让它任意扩展吗?”不;你应该变得知识渊博!你不会问“我不知道我的客户将如何使用我的类,所以我应该让我的所有属性都可以读写吗?我应该让我的所有方法都可以读写委托(delegate)类型的属性,以便我的用户可以用自己的实现替换任何方法吗?”不,在您有证据用户确实需要该功能之前,不要做任何这些事情!花宝贵的时间设计、测试和实现用户真正想要和需要的功能,并从知识的角度来做。

关于c# - 我应该将所有方法标记为虚拟吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14451325/

相关文章:

java - 为什么Java源码中的InetAddress.isSiteLocalAddress()总是返回false

java - 使用多种方法时缺少返回语句错误

c# - 使用 c# 从 Azure 存储帐户表检索记录,同时使用 xamarin 开发跨平台应用程序给出错误

c# - UpdatePanel ASyncPostBack 的烦恼

java - Q : Solve almostIncreasingSequence in Java (Codefights)

java - Spring 超时后抛出 "ERROR SqlExceptionHelper: Already closed"

c# - 如何在 Windows 8 应用程序中访问另一个程序的应用程序数据中的文件?

c# - 如何在 Unity C# 中调用此 IEnumerator

java - 新的 Java 编码器。需要帮助将游戏放入方法和类中

java - 从方法返回一个值并将其存储到数组中以供另一个方法使用