关于保护成员是否有意义的一点看法
我们知道,一般的面向对象语言,都会有类,而类成员一般有三种访问权限:公开,保护,私有。
有些人说,“保护”似乎没有什么价值,还建议不用。
有些人却认为,没有“保护”,举步维艰。
我觉得,“保护”属于类库维护者,而“公开”属于类库使用者。只要我们明白这两个身份的不同,就好理解该如何使用“保护”了。
比如,你本身是类库的设计者,或者是团队设计者之一,那么你也可能自己做自己的类库维护者。但是类库维护者并不好当。从接口的角度,“保护”成员对类库维护者来说是属于“接口”级别的,所谓接口,就要维持他的不变性。我们要维持接口的不变性,非常难,唯一的办法就是尽量减少“接口”,将不必要的封装起来。但是“保护”成员却将很多成员转化成了接口,必然会让代码的维护量指数飙升。所幸的是,你和你的团队牢牢控制着类库代码,想怎么改就怎么改。
但,如果你并不是类库的设计者,结果会相当麻烦。因为你用到“保护”后,类库的设计者如果改变“保护”成员,就破坏掉你的代码。因此他们绝对不应该去改变“保护”的成员,这对于他们来说是一个很大的负担。
因此,你要使用“保护”,你就必须承担“类库维护者”的风险,你的代码就要承担比只是“类库使用者”更大的修改风险。
这也是为什么有些人提倡完全不用“保护”的原因。
那为什么还是有很多类库愿意冒风险去使用“保护”成员呢?保护相对于公开,代表了两种层次,一个是具体实现,一个是抽象接口。人们想用“保护”,是为了有机会修改实现。如果没有“保护”,只能从新建立一个实现,而不能修改原有的实现。这对很多情况是相当麻烦的。
总的来说,我是赞成,尽量少用“保护”,有些时候,通过其他一些方法,也能局部改变实现,而不需要完全建立新的实现,又能避免“保护接口”的维护的。