在C#和C ++ / CLI中,关键字sealed
(或NotInheritable
在VB中)用于保护类免受任何继承机会(该类是不可继承的)。我知道面向对象编程的一个功能是继承,我觉得使用sealed
与该功能相反的功能会停止继承。是否有一个示例可以说明sealed
使用它的好处以及何时使用它很重要?
Answers:
在实现安全功能的类上,这样原始对象就不能被“模拟”。
更笼统地说,我最近与Microsoft的一位人员进行了交流,他告诉我,他们试图将继承限制在真正有意义的地方,因为如果不加以处理,则在性能上会变得昂贵。
sealed关键字告诉CLR,没有其他类可以查找方法,并且可以加快处理速度。
在当今市场上大多数性能增强工具中,您会找到一个复选框,该复选框将密封所有未继承的类。
但是请小心,因为如果您希望通过MEF允许插件或程序集发现,则会遇到问题。
狒狒出色答案的附录:
在相关说明中,仅适用于未密封的类:创建的任何方法virtual
都是扩展点,或者至少看起来像它应该是扩展点。声明方法也virtual
应该是一个有意识的决定。(在C#中,这是一个有意识的决定;在Java中不是。)
编辑:一些相关链接:
还请注意,默认情况下,Kotlin会密封类。它的open
关键字与Javafinal
或sealed
C#相对。(可以肯定的是,没有普遍的共识,这是一件好事。)
将类标记为Sealed
可以防止篡改可能危及安全性或影响性能的重要类。
很多时候,在设计具有固定行为的实用程序类时,密封类也是有意义的,而我们不想更改。
例如,中的System
命名空间C#
提供了许多密封的类,例如String
。如果没有密封,则有可能扩展其功能,这可能是不希望的,因为它是具有给定功能的基本类型。
同样,structures
在C#
中总是隐式密封。因此,不能从另一个结构派生一个结构/类。这样做的原因是,structures
它们仅用于建模独立的,原子的,用户定义的数据类型,而我们不想修改它们。
有时,当您构建类层次结构时,您可能想根据域模型或业务规则来限制继承链中的某个分支。
例如,aManager
和PartTimeEmployee
都是Employee
s,但是您在组织中的兼职员工之后没有任何作用。在这种情况下,您可能需要密封PartTimeEmployee
以防止进一步分支。另一方面,如果您有每小时或每周的兼职员工,则可以从继承PartTimeEmployee
。
unseal
如果需要的话,以后对类进行比较容易,而不是密封它并破坏依赖于它的所有类。
我认为这篇文章有一些好处,具体情况是,当尝试将非密封类强制转换为任何随机接口时,编译器不会抛出错误。但是当使用密封时,编译器会抛出无法转换的错误。密封类带来了额外的代码访问安全性。
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla