Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 封闭一个类_C#_Design Patterns - Fatal编程技术网

C# 封闭一个类

C# 封闭一个类,c#,design-patterns,C#,Design Patterns,在过去,封闭一个班级并不是我非常注意的事情,但是我发现自己想知道什么是最佳实践。如果你知道一个类不会或者不应该从中派生,你会把它封起来作为一种预防措施吗?只需在知道有人试图从中派生的可能性很小的情况下,把sealed关键字放在外面 我想我要问的是,作为一种良好实践,您是否应该密封所有不打算继承的类?您不应该任意密封所有在任何给定时间都不打算继承的类 相反,您知道的seal类永远不应从中继承,而让其他类保持打开状态。如果在以后的某个时间点,可以决定永远不要继承这些类,那么可以将它们密封。如果严格遵

在过去,封闭一个班级并不是我非常注意的事情,但是我发现自己想知道什么是最佳实践。如果你知道一个类不会或者不应该从中派生,你会把它封起来作为一种预防措施吗?只需在知道有人试图从中派生的可能性很小的情况下,把sealed关键字放在外面


我想我要问的是,作为一种良好实践,您是否应该密封所有不打算继承的类?

您不应该任意密封所有在任何给定时间都不打算继承的类


相反,您知道的seal类永远不应从中继承,而让其他类保持打开状态。如果在以后的某个时间点,可以决定永远不要继承这些类,那么可以将它们密封。

如果严格遵循原则,则永远不要使用sealed关键字。但我猜总会有一些极端情况。

我唯一注意到类被密封的时候是我确实需要从中派生一些东西,但后来发现我不能

我从未觉得有必要封闭自己的班级。我只是觉得我不够聪明,不知道什么时候不应该派生类。我很聪明,但我不能预知未来


对于核心.NETFramework类来说,将其密封可能有一定的意义,以便它们能够严格控制框架的行为,但我从未见过日常开发人员需要这样做的情况。您可能不想鼓励派生类,但封缄类是最终决定,谁知道您下周/月/年/一生的需求是什么?

我不会给您一个直接的答案,但这里有一些事情需要考虑:

密封类可能会给您带来(轻微的)性能优势。请参阅此线程:

密封类通常会干扰通过子类化代码实现的通用模拟框架

进一步阅读:


实际上,我通常不密封类。

是的,如果您希望类不能被继承,只需添加“Sealed”关键字即可。这个类不能是抽象的,不能有受保护的或虚拟的方法/字段。

在应用程序代码中,从类派生的所有代码都由您自己控制,默认情况下,我会保留大多数未密封的类。如果您通过更改基类来破坏从类派生的代码,您可以简单地修复它

但是密封在库代码中非常有用。如果未密封某个类,则承诺不会破坏从该类派生的任何代码。i、 你增加了你的公共面积。IMO图书馆应在默认情况下保持最小的表面积,这意味着密封

但并不总是需要封闭整个班级。密封部分或所有虚拟方法就足够了。这样,从类派生的代码只能对其进行扩展,而不能通过重写方法修改其当前功能


另一种类,通常应该是具有值语义的密封类。对于未密封的类,要实现正确的等式和伪变式要困难得多。因此,除非真的有必要,否则我会简单地密封它们并避免额外的工作。

可能重复的“以后某个时间点……您可以密封它们。”仅在应用程序代码中。在库代码中,您只能解封类,但不能密封它们,而不会破坏构建在其上的代码。因此,作为一名图书馆作者,默认情况下盖章是合理的。我觉得这与应该做的恰恰相反。稍后密封一个类是一个突破性的变化,而解封则不是。除非您仔细考虑过当人们对您的类型进行子类化时可能会做什么,否则您可以引入脆弱的基类问题。@Andy-您是对的。不幸的是,答案被接受后,另一条评论中指出了错误,您无法删除被认为是被接受答案的帖子。@Andy您不应该编辑一个问题,只说“查看评论”。如果评论如此重要,那么编辑问题以将信息包含在其中。@JustinNiessner,还有其他人可能会读到这篇文章:介意帮我吗?我理解这些基本知识,我只是好奇什么是最佳实践。虽然它可以从自己的基础上继承保护和虚拟成员。您仍然可以通过密封类遵循开/闭原则,例如使用组合。推荐的一个好的设计原则是支持组合而不是继承。