当前位置: 首页 > 面试题库 >

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

宰父夕
2023-03-14
问题内容

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

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

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


问题答案:

在C#中,您必须将方法标记为虚方法,以使其能够被覆盖。这是否意味着在C#中您应该将所有方法标记为虚拟方法(除了一些您不想被覆盖的方法之外),因为您很可能不知道可以用什么方式继承您的类?

否。如果语言设计人员认为virtual应该是默认值,那么 它将是默认值

可覆盖性是一种 功能 ,与所有功能一样,它也有 成本
。可重写方法的成本很高:设计,实现和测试成本很高,尤其是对类有“敏感性”时;虚拟方法是将未经测试的第三方代码引入系统的方式,并且具有安全性。

如果您不知道如何继承您的类, 请不要发布您的类, 因为 您尚未完成对它的设计。
您的扩展性模型绝对是您应该提前知道的;它会深刻影响您的设计和测试策略。

我主张所有类都是 密封的, 并且所有方法都是 非虚拟的, 直到您有一个以客户为中心的真实世界的理由来解封或将方法虚拟化。

基本上,您的问题是“我不知道我的客户打算如何消费我的课程;因此我应该使它可以任意扩展吗?” 没有; 你应该 变得博学多才
!您不会问:“我不知道我的客户将如何使用我的类,所以我应该将我的所有属性都读写吗?并且我应该使我的所有方法都可以读写委托类型的属性,以便我的用户可以用自己的实现替换任何方法吗?”
不,在您有 证据证明 用户确实需要该功能之前,请勿执行任何此类操作!花费宝贵的时间来设计,测试和实施用户真正想要和需要的功能,并从知识的角度去做。



 类似资料:
  • C核心指南包含以下关于、和说明符的建议,特别是与派生类析构函数相关的建议: 如果基类析构函数声明为虚拟,则应避免将派生类析构函数声明为虚拟或重写。某些代码库和工具可能会坚持重写析构函数,但这不是这些准则的建议。 果然,是违反建议的工具之一。如果我没有指定或,运行会发出以下警告: 或者,如果仅指定为: 特别是,指定<code>override</code>的优点是(至少)确保正确地将基类析构函数指定

  • 问题内容: 该方法中类抛出2 :和,但在我的书上面的代码捕获和。 为什么代码会捕获但没有捕获? 如果在线文档的Formatter类format()方法中甚至没有声明它,我们如何知道是否需要捕获? 问题答案: 文献:是一个 可以由不同类的在Java中像迭代器,枚举,被抛出 扫描仪 或StringTokenizer的。 在你的情况是。它不是从方法。 这 仅仅是在安全方面(如果不给下一个输入,然后抛出此

  • 问题内容: 在继承中虚拟函数如何在后台工作?编译器是否特别对待虚拟函数? 问题答案: 是的,编译器和运行时对虚拟方法的处理方式有所不同。JVM专门利用虚拟方法表进行虚拟方法分配: 对象的调度表将包含对象的动态绑定方法的地址。通过从对象的分派表中获取方法的地址来执行方法调用。属于同一类的所有对象的分发表都是相同的,因此通常在它们之间共享。属于类型兼容类的对象(例如,继承层次结构中的同级对象)将具有具

  • 我想知道为什么我们不应该重写非虚拟函数?

  • 到目前为止我有四张桌子。它们被命名为: 用户,帮派,gang_business,gang_members,gang_weapons 我试图弄清楚是否应该使用“user”或“gang”表的主键作为“gang_business”、“gang_members”和“gang_武器”表的外键。“gang”表将用户的主键作为外键。我想知道哪条路是最好的。请给我你最好的建议和反馈。谢谢 用户表:(用户id、用户