oop - 什么时候防止类继承?

标签 oop inheritance

最近有人告诉我,在面向对象编程中的一个很好的实践是。你应该总是允许继承你的类 .我真的不这么认为,但我没有可靠的论据。

真实世界阻止继承的示例 :

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

  • 可能原因我认为是:
  • 安全 ,因为子类可能有权访问敏感的内部。 (我不这么认为——他们不会访问私有(private)成员。)
  • 业绩 ,因为子类可能会通过覆盖一些成员函数来破坏我们的高效实现。 ( child 不会覆盖非虚拟函数。)
  • 强制组合而不是继承 . (我完全同意。我们不应该支持不需要的继承。)

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

    最佳答案

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

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

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

    关于oop - 什么时候防止类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464406/

    相关文章:

    C++:从另一个构造函数隐式调用构造函数

    c++ - 两次声明纯虚函数是否完全合法(在层次结构中的两个类中)

    c++ - 我是否必须为 C++ 中的派生类编写相同的构造函数?

    C++继承,将成员添加到派生类并重新定义构造函数

    Javascript:仍然对 instanceof 运算符感到困惑

    c++ - 使用共享指针访问单例子类时出现 SEGFAULT

    c++ - 指向动态数组的指针数组 : how to access without variable name

    java - 封装与数据隐藏?

    c++ - 如何成功创建一个创建对象并返回指向该对象的指针的函数?

    javascript - 何时使用访问器属性