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++中对象的继承和双端队列

    python - SqlAlchemy 表继承和主键

    c++ - 如何在不继承 A 类的情况下使 A 类成为 B 类的成员?

    java - 将 JMenuItem 传递给 Controller ​​类

    PHP INSERT INTO MySQL 不工作?

    c++ - 类包含其他类问题的字段

    c++ - 继承中的函数定义

    python - 使具体类抽象,保留构造函数

    php - 在 PHP 中合并类成员

    c# - 工厂模式、另一种模式还是根本没有模式?