oop - 为什么 OO 语言真的需要 PROTECTED 访问修饰符?

标签 oop access-modifiers protected

我可以理解为什么会有 public 和 private 访问修饰符,这两个几乎在任何语言中都可以找到。我什至可以理解为什么可能有一个包修饰符,因为您可能希望您的类(那些紧密属于一起的)以某种方式相互交互,这不适合公共(public)交互(例如,因为它取决于知识类内部,可能是因为它会泄露一个 secret ,或者可能是因为它可能随时更改并且依赖它会破坏所有现有代码,等等)。但是,为什么我想要一个 protected 标识符?不要误会我的意思,我知道 protected 含义,但是为什么我希望我的类的子类访问某些实例变量或使用某些方法,仅仅因为它们是子类并且即使它们是不同包的一部分? protected 真实世界用例是什么?

(并且作为实例变量的参数的性能不计算在内,因为 JIT 编译器总是可以内联访问器方法,将它们的调用开销降低到零)

最佳答案

公共(public)方法是公共(public)接口(interface)的一部分。私有(private)方法是内部方法。 protected 方法是扩展点。

protected您可以通过重写类来重新定义类的功能,而无需将此方法作为公共(public)接口(interface)的一部分。

另一件事- protected 方法是可以被子类重用的通用方法,但也不需要成为公共(public)接口(interface)的一部分。

例如,在 java 集合框架中,有 AbstractList类(class)。它保护了modCount字段和 protected removeRange方法:

  • modCount所有子类都使用(递增)字段来计算修改次数。 IteratorAbstractList 返回使用该字段
  • removeRange方法可以被子类重用,而不是让它们再次定义它。

  • See this Josh Bloch 关于 API 设计的相关演示。

    如评论中所述,以及 Bloch 的演示文稿中 - 很好地记录您的类(class)。如果它是为了继承 - 请付出额外的努力。

    关于oop - 为什么 OO 语言真的需要 PROTECTED 访问修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279793/

    相关文章:

    java - 在 Util 类中拥有私有(private)静态字段是不是很糟糕?

    java - 私有(private)方法真的安全吗?

    java - 为什么java不让我调用这个 protected 函数

    Ruby - protected 方法

    c++ - 公共(public)/ protected /私有(private)继承的问题

    c++ - 从静态函数访问静态变量

    javascript - 游戏服务器OOP设计

    c++ - 为什么/如何清理静态的机制获得允许它调用私有(private)成员的访问权限?

    c# - 具有必需类和多个可选类的 View 模型

    c# - 无法使用实例引用访问静态成员;用类型名称限定它