少儿编程班学什么:你什么时候、为什么要封班(why sealed class is used in c#)

关于少儿编程班学什么的问题,在why sealed class is used in c#中经常遇到, 在 C # 和 C ++ / CLI 中,关键字sealed(或 VB 中的NotInheritable)用于保护类免受任何继承机会(该类将是不可继承的)。我知道面向对象编程的一个功能是继承,我觉得使用sealed违背了这个功能,它停止了继承?有一个例子显示的好处吗?

在 C # 和 C ++ / CLI 中,关键字sealed(或 VB 中的NotInheritable)用于保护类免受任何继承机会(该类将是不可继承的)。我知道面向对象编程的一个功能是继承,我觉得使用sealed违背了这个功能,它停止了继承?有一个例子显示的好处吗?

131

在实现安全功能的类上,以便不能“模拟”原始对象。

更一般地说,我最近与微软的一个人进行了交流,他告诉我,他们试图将继承限制在真正有意义的地方,因为如果不加以处理,它会在性能方面变得昂贵。
密封的关键字告诉 CLR,没有类可以进一步寻找方法,这加快了速度。

在当今市场上的大多数性能增强工具中,您会发现一个复选框,该复选框将密封所有未继承的类。
不过要小心,因为如果要允许通过 MEF 进行插件或程序集发现,则会遇到问题。

23

Louis Kottmann's excellent answer的附录:

如果一个类不是为继承设计的,子类可能会class invariants。当然,这只适用于创建公共 API 的情况,但是根据我的经验,我密封了任何没有明确设计为子类的类。

在相关说明中,仅适用于未密封的类:创建的任virtual都是扩展点,或者至少看起来应该是扩展点。声明方法virtual也应该是一个有意识的决定。(在 C # 中,这是一个有意识的决定;在 Java 中不是。)

然后是这样的:

密封可以使单元测试更加困难,因为它禁止嘲笑。

一些相关链接:

Effective Java, 2nd Edition作者:Joshua Bloch。请参阅第 17 项(需要订阅 Safari)

Effective Java Item 17: Design and document for inheritance or else prohibit it(同一项目的讨论)

另请注意,Kotlin默认情况下密封类;its open keyword is the opposite of Java's final or the sealed of C#。(可以肯定的是,there is no universal agreement that this is a good thing。)

4

将类标记为Sealed可防止篡改可能危及安全性或影响性能的重要类。

很多时候,当一个人设计一个具有固定行为的实用程序类时,密封一个类也是有意义的,我们不想改变。

例如,C#中的System命名空间提供了许多密封的类,例如String。如果不密封,则有可能扩展其功能,这可能是不希望的,因为它是具有给定功能的基本类型。

同样,C#中的structures总是隐式密封的。因此,不能从另一个结构派生一个结构 / 类。原因是structures仅用于建模独立的,原子的,用户定义的数据类型,我们不想修改。

有时,在构建类层次结构时,您可能希望根据域模型或业务规则限制继承链中的某个分支。

例如,ManagerPartTimeEmployee都是Employee,但您在组织中的兼职员工之后没有任何角色。在这种情况下,您可能需要密封PartTimeEmployee以防止进一步分支。另一方面,如果您有每小时或每周的兼职员工,则从1继承它们可能是有意义的。

2

我认为这篇文章有一些很好的观点,具体情况是当试图将一个非密封的类转换为任何随机接口时,编译器不会抛出错误;但是当使用密封时,编译器会抛出无法转换的错误。密封类带来了额外的代码访问安全性。
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(994)
Fast pic:PIC接收UART覆盖 读取不够快
上一篇
Change pro:FileMakerPro6更改语言
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(34条)