Oop 什么时候写私有方法,而不是受保护的?

Oop 什么时候写私有方法,而不是受保护的?,oop,Oop,如果我在写一个类,我什么时候把一个方法设为私有的,而不是受保护的?换句话说,我怎么能提前知道客户机程序员永远不需要重写方法?在这种情况下,它是有外部考虑的东西,比如数据库连接 换言之,我怎么能知道 客户机程序员可能会 永远不需要重写一个方法 如果你不知道,我想他们需要知道。如果你认为这没问题(即,如果你认为他们应该能够),那么使用受保护的;否则,请使用private不要把私有/受保护/公共的东西看作程序员永远“需要”一个方法。把它想象成你想让他们访问它 如果您认为应该允许他们更改DB连接字符串,

如果我在写一个类,我什么时候把一个方法设为私有的,而不是受保护的?换句话说,我怎么能提前知道客户机程序员永远不需要重写方法?在这种情况下,它是有外部考虑的东西,比如数据库连接

换言之,我怎么能知道 客户机程序员可能会 永远不需要重写一个方法


如果你不知道,我想他们需要知道。如果你认为这没问题(即,如果你认为他们应该能够),那么使用
受保护的
;否则,请使用
private

不要把私有/受保护/公共的东西看作程序员永远“需要”一个方法。把它想象成你想让他们访问它


如果您认为应该允许他们更改DB连接字符串,则将其公开。

私有成员用于封装类的内部工作。使用它们保存只有您才能访问的数据。例如,假设您有一个名为_name的字段和一个名为GetName()/SetName(name)的getter/setter。在允许SetName成功之前,可能需要对name进行一些语法检查,否则会引发异常。通过将_name设置为private,可以确保在对name进行任何更改之前进行语法检查(除非您自己在自己的类和代码中更改_name)。通过使其受到保护,您就对您的类的任何潜在未来继承人说,“继续,用我的字段来蒙混过关。”


一般来说,protected仅在特殊情况下少量使用。例如,您可能有一个受保护的构造函数,它向子类公开一些额外的构造功能。

我通常从最低级别开始。如果你不确定,就保密。然后,根据需要,您可以将内容保护或公开


这个想法是,从私有到受保护不是一个突破性的变化,但从另一个方向走可能是一个突破性的变化

我总是将所有方法
设为私有
作为默认值。这是为了保持界面干净和易于维护


更改或隐藏已经可见的方法比使私有方法更可见要困难得多。至少在您需要与现有客户端代码兼容的情况下。

public
protected
方法构成了对象的“接口”,对于使用(委托)您的类的开发人员,
public
,对于希望通过子类化扩展对象功能的开发人员,
protected

请注意,即使您的类将被子类化,也没有必要提供受保护的方法

无论是
public
还是
protected
接口,都需要仔细考虑,特别是如果这是一个供您无法控制的开发人员使用的API,因为对接口的更改可能会破坏对现有接口如何工作的假设程序

private
方法仅供对象的作者使用,可以随意重构、更改和删除


默认情况下,我会选择
private
,如果您发现需要公开更多的方法,请仔细考虑它们将如何使用——特别是如果它们是虚拟的——如果它们被另一个开发人员完全替换为任意的替代函数会发生什么——您的类还能工作吗?然后设计一些适当的
受保护的
,这对开发人员子类化您的对象(如果需要)很有用,而不是公开现有的函数。

我通常只将所有的
都私有化
,并在需要从基类调用它时进行重构

除了当我感到懒惰,做任何事
受保护的时候
,那肯定不危险

换言之,我怎么能知道 客户机程序员可能会 永远不需要重写一个方法


你不能。你不需要这么做。您的工作不是预测开发人员是否希望重写方法,更不用说如何重写了。只要假设他想这样做,并使他这样做,而不必触摸您的代码。出于这个原因,如果不需要,不要声明方法
private

如果开发人员觉得需要调整类的某些功能,他可以从许多结构和行为模式中进行选择,例如装饰器、适配器或子类化。使用这些模式是很好的,因为它将更改封装到开发人员自己的类中,并保持您自己的代码不变。通过声明方法
private
,您可以确保开发人员将使用您的类。这很糟糕

Zend Framework的DB适配器就是一个很好的例子。它们不鼓励使用持久连接,并且它们的适配器对此没有任何意义。但是,如果您仍然想要这个,并且适配器方法被标记为
private
(不是,但是如果呢)?由于无法覆盖该方法,您可以(是的,您可以)直接在其类中更改适配器代码,或者将代码复制并粘贴到您自己的适配器类中,只需更改单个函数调用即可有效复制99%的类。无论何时对此适配器进行更新,您要么会丢失更改,要么无法获得更改(以防c&p更改)。如果它被标记为
protected
(实际上),您就可以编写一个pConnectAdapter子类

此外,当子类化时,实际上是说子类是父类。因此,您可以期望派生类具有与父类相同的功能。如果父类中存在子类中不可用的功能,则从概念上来说,禁用它属于子类

这就是为什么我发现将所有方法和属性默认为
protected
可见性和