如果我正在编写一个类,那么我何时应该将方法设置为私有(private),而不是受保护的(protected)?换句话说,我如何事先确定客户端程序员永远不需要重写一个方法?在涉及外部考虑因素(如数据库连接)的情况下呢?
如果我正在编写一个类,那么我何时应该将方法设置为私有(private),而不是受保护的(protected)?换句话说,我如何事先确定客户端程序员永远不需要重写一个方法?在涉及外部考虑因素(如数据库连接)的情况下呢?
public
和protected
方法构成了你的对象的“接口”,public
为使用(委托)你的类的开发人员提供,而protected
则为希望通过子类化来扩展你的对象功能的开发人员提供。
请注意,即使你的类将被子类化,也不必提供protected
方法。
需要仔细考虑public
和protected
接口,特别是如果这是一个由你控制之外的开发人员使用的API,因为对接口的更改可能会破坏那些假设现有接口如何工作的程序。
private
方法完全是为了对象作者而存在的,可以任意重构、更改和删除。
我会默认选择private
,如果你发现需要暴露更多方法,请仔细考虑它们将如何被使用——特别是如果它们是虚函数——如果它们被另一个开发人员完全替换为任意的替代函数,你的类还能正常工作吗?然后设计一些适当的protected
方法,这些方法对于开发人员子类化你的对象非常有用(如果需要),而不是暴露现有函数。
protected
比较好的实践,只有那些允许其他类或脚本与我的类交互的方法(不包括属性)才标记为public
,但只有少数私有的东西。这样一来,我给开发人员选择使用我的类的方式以及调整它的选项。如果他在这个过程中出了问题,很可能是他的错,而不是我的。protected
而不是private
,这会迫使我编写一个补丁程序。作为一个程序员,如果我重写了受保护的方法,而没有理解它的作用,我并不指望我继承的类能够完美地工作。相反,我会阅读代码,理解正在做什么以及如何完成,然后相应地重写该方法。我期望与我的代码一起工作的人也能这样做。+1 - Christof我通常会从最低层级开始。如果你不确定,就将其设为私有。然后根据需要,可以将其改为受保护的或公开的。
这样做的想法是,从私有到受保护并不会造成破坏性变化,但从受保护到私有可能会造成破坏性变化。
我通常将所有方法默认设置为private
。这样做是为了保持接口干净易于维护。
相比之下,更改或隐藏已经可见的方法比使私有方法更加可见要困难得多。至少如果你需要与现有客户端代码兼容的话。
我通常会将所有东西都声明为private
,并在需要从基类调用时重构代码。
除非我感到懒惰,将所有可能不安全的内容都声明为protected
。