何时防止类继承?

Jan*_*nar 5 oop inheritance

我最近被告知面向对象编程的一个很好的做法,你应该总是允许从类中继承.我真的不这么认为,但我没有坚定的论据.

阻止继承的真实示例:

  1. 没有C++ STL类(专用类模板)允许继承(具有非虚拟析构函数).
  2. Java有final类修饰符,适用于许多标准组件,如java.lang.String.

我认为可能的原因是:

  1. 安全性,因为子类可能有权访问敏感的内部.(我不这么认为 - 他们不会访问私人会员.)
  2. 性能,因为子类可能会通过覆盖某些成员函数来破坏我们的高效实现.(孩子们不会覆盖非虚拟功能.)
  3. 强制组合物过度继承.(我完全同意.如果不需要继承,我们不应该赞成继承.)

所以我的问题是:在什么情况下我应该故意阻止继承?

JB *_*zet 5

事实上,我尝试遵循的做法,以及 Josh Bloch 在他的《Effective Java》一书中推荐的做法,正是与您被告知的规则相反的规则:除非您考虑过继承,否则将您的类设计为可继承的,并记录了如何必须继承您的类,您应该始终禁用继承。

我建议您阅读《Effective Java》的这一章(您不会后悔购买它),并将其展示给告诉您这条规则的人。

禁止继承的最明显的原因是不变性。不可变对象使用简单(只有一种状态),可以缓存,在许多对象之间共享,并且本质上是线程安全的。如果该类是可继承的,则任何人都可以扩展该类并通过添加可变属性使其可变。