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/

    相关文章:

    perl - 没有符号引用的调度方法

    java - 处理到类里面的字段。通过getter还是explicit?

    java - "Parent c = new Child()"和 "Child c = new Child()"有什么区别?

    java - Java 继承中私有(private)访问说明符的使用

    c++ - 在 C++ 中,是否可以将类声明为从另一个类继承?

    php - 如何从 Symfony2 上的另一个 Bundle 加载实体

    java - 返回并打印字段值还是仅通过类方法打印值?

    java - 使用类的对象获取对其内容的引用的术语或惯用语是什么?

    c++ - C++构造函数继承

    c++ - 用于两个以上继承级别的非虚拟接口(interface)习惯用法?