假设有一个public
成员变量,若最终取消了它。则所有使用它的客户码都会被破坏,而那是一个不可知的大量。因此 public
成员变量完全没有封装性。
假设有一个protected
成员变量,若最终取消了它,则所有使用它的derived classes
都会被破坏,那往往也是个不可知的大量。因此,protected
成员变量就像public
成员变量一样缺乏封装性,因为在这两种情况下,如果成员变量被改变,都会有不可预知的大量代码受到破坏。
一旦你将一个成员变量声明为public
或protected
而客户开始使用它,就很难改变那个成员变量所涉及的一切。太多代码需要重写、重新测试、重新编写文档、重新编译。
从封装的角度观之,其实只有两种访问权限: private
(提供封装)和其他(不提供封装)。
总结:
- 切记将成员变量声明为
private
。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件获得保证,并提供class
作者以充分的实现弹性。- protected并不比public更具封装性。