受保护数据

2003年5月14日

在类中使用protected访问修饰符来存储数据,这是否是一种好的面向对象设计?

面向对象设计者意见不一,关于是否应该将所有数据设为私有,或者是否允许一些数据为公共。

(在我深入这个浑浊的池子之前,我应该指出,protected 访问修饰符的含义在不同的语言中存在细微但重要的差异。)

我认为这个话题之所以如此困难,是因为人们要么从团队内部开发的角度,要么从跨团队开发的角度来看待它,而正是这种观点占主导地位。

一方面,如果我正在编写一个子系统,并决定通过层次结构来实现某些行为,那么我很乐意让子类对它们的超类有深入的访问权限。毕竟,这都是我的代码——我使用子类来提供多态行为,而不是提供模块化。

另一方面,如果我正在构建一个框架,并提供我希望被覆盖的钩子类,我可能希望保护数据,以便我可以在将来进行更改而不会破坏人们的子类。事实上,这比这更阴险,因为子类很容易在你不小心的时候破坏超类——这被称为脆弱基类问题

因此,我认为你不能说将数据设为受保护的始终是好事或坏事。如果你打算让你的控制范围之外的客户端覆盖某个类,那么你应该将你的受保护特性视为已发布接口的一部分,并因此更加小心。发布字段是一个坏主意,所以我不会在那种情况下这样做。

但如果这不是你的意图,并且它有助于你在你编写的子类中访问数据,那么在我看来这是合理的。但我承认我的默认做法是将字段设为私有,而且我很少将其更改为受保护的。

一个相关的问题是,你是否应该使用自我封装