你什么时候打算上课?

时间:2011-10-15 11:40:55

标签: c# .net oop c++-cli

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

4 个答案:

答案 0 :(得分:85)

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

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

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

答案 1 :(得分:12)

狒狒的优秀答案附录:

  1. 如果某个类没有设计进行继承,则子类可能会中断class invariants。这当然只适用于您正在创建公共API的情况,但是根据我的经验,我会封锁任何未明确设计为子类的类。
  2. 在相关说明中,仅适用于未密封的类:创建的任何方法virtual是一个扩展点,或者至少看起来应该是一个扩展点。声明方法virtual也应该是一个有意识的决定。 (在C#中,这是一个有意识的决定;在Java中,它不是。)

    编辑:一些相关链接:

    另请注意,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。)

答案 2 :(得分:1)

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

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

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

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

有时,当您构建类层次结构时,您可能想根据域模型或业务规则在继承链中确定某个分支。

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

答案 3 :(得分:-2)

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