最近有人告诉我,在面向对象编程中的一个很好的做法是,您应该始终允许从您的类中继承。我真的不这么认为,但我没有可靠的论据。
阻塞继承的真实例子:
- 没有 C++ STL 类(专用类模板)允许继承(具有非虚拟析构函数)。
- Java 具有
final
适用于许多标准组件的类修饰符,例如java.lang.String
.
我认为可能的原因是:
- 安全性,因为子类可能有权访问敏感的内部。(我不这么认为——他们不会访问私人成员。)
- Performance,因为子类可能会通过覆盖一些成员函数来破坏我们的高效实现。(孩子不会覆盖非虚拟功能。)
- 强制组合而不是继承。(我完全同意。我们不应该支持不需要的继承。)
所以我的问题是:在什么情况下我应该故意阻止继承?