受保护的成员是公共 API 的一部分吗?

Are protected members part of the public API?

提问人:joel 提问时间:5/18/2020 最后编辑:joel 更新时间:5/21/2020 访问量:146

问:

由于受保护的成员可以由子类访问,它们是否是公共 API 的一部分?因此,它们是否与显式公共成员共享相同的向后兼容性要求?

我想这个问题会变得更加复杂(来自例如 Scala)。随意回答或不回答这一点。private[foo]

OOP 与语言无关的 保护

评论

1赞 jonrsharpe 5/18/2020
人们是否(或可以)通过对对象进行子类化来使用它们?如果是这样,则受保护的属性实际上是公共的;更改受保护的 API 会破坏其他人的代码。

答:

2赞 jaco0646 5/18/2020 #1

是,是:受保护的成员是导出的(公共)API 的一部分,并且具有相同的兼容性要求。

Java 包含访问修饰符,作为众多 JVM 和非 JVM 语言的前身,这些语言紧随其后;Effective Java 对此事有权威声明。

第 15 项:最小化类和成员的可访问性

...私有成员和包私有成员都是类实现的一部分,通常不会影响其导出的 API。

对于公共类的成员,当访问级别从包专用变为受保护时,可访问性会大幅增加。受保护成员是类导出的 API 的一部分,必须永远受支持。此外,导出类的受保护成员表示对实现细节的公开承诺。对受保护成员的需求应该相对较少。