我使用“受保护”而不是“私人”,因为有一天我可能需要扩展我的课程,这很糟糕吗?

Posted

技术标签:

【中文标题】我使用“受保护”而不是“私人”,因为有一天我可能需要扩展我的课程,这很糟糕吗?【英文标题】:I'm using "protected" instead of "private", because someday I could need to extend my classes, is that bad? 【发布时间】:2011-06-24 01:23:54 【问题描述】:

我注意到我的代码中有一个模式。我通常选择protected,而不是private,作为我的类中“隐藏”方法和字段的默认访问标签。我这样做主要是因为它为该类的用户隐藏了有关该类功能的详细信息,同时仍为将来的扩展留出了空间。这个编码“策略”有什么缺点吗?

谢谢 图努兹

【问题讨论】:

重点是你应该有一个理由来做出选择。不知道我怎样才能做到足够长的时间来构成答案。如果未来的子类可能需要覆盖特定方法,请将其设为protected。如果没有办法需要覆盖它(即,它是使这个类成为它的样子的一些不可或缺的功能,并且覆盖它会完全破坏这个类),请将其设为私有。我不明白这种寻找我经常在这里看到的“一刀切”规则的驱动力。 好的,当然你在编码的时候需要推理。但是,在某些情况下(这些天我经常发现自己)我不知道有一天课程是否可以延长。 【参考方案1】:

一般来说,永远不要做任何事情,因为有一天你可能不得不实施或做 yadayada(它只会让生活变得复杂和悲惨,恕我直言..)。如果您有一个只应在其类中使用的方法,则将其设为私有。如果您必须通过继承来扩展它,而不是重新考虑可能必须从下面访问哪些函数。通常我无论如何都会将方法抽象到我的超类中,所以无论如何我都必须考虑何时何地需要什么..

忽略我所说的私有方法的一个很好的理由是,如果你想测试你的内部函数,即在单元测试中。在 C# 中,您可以允许另一个项目从外部查看您的受保护方法,以便您可以针对它们编写测试。

【讨论】:

private 真正优于protected 的唯一情况是基类的未来版本是否可能受益于更改相关成员的行为。否则,我会建议,如果无法阐明未来版本的基础可能想要改变行为的原因,那么未来派生类可能更有可能受益于能够访问相关成员。【参考方案2】:

由于封装,您应该选择 private 。在这个问题上我更喜欢保守的方法,我更喜欢私有访问修饰符,如果我确实期望一些扩展,那么我选择受保护的访问修饰符。选择受保护的修饰符而不是私有的不是好习惯。

【讨论】:

【参考方案3】:

我认为没有缺点。

私有变量是仅对它们所属的类可见的变量。 受保护的变量是仅对它们所属的类和任何子类可见的变量。

因此,您的代码应该一切正常。没有什么“坏”的。如果你可能扩展你的类,那么受保护的属性肯定是正确的。

【讨论】:

以上是关于我使用“受保护”而不是“私人”,因为有一天我可能需要扩展我的课程,这很糟糕吗?的主要内容,如果未能解决你的问题,请参考以下文章

对字段和方法使用私有而不是受保护的原因

合成的实例变量是不是生成为私有而不是受保护?

财产公共和私人但不受保护?

PHP5 保护变量背后的推理

Java:访问修饰符比“受保护”更严格,比“私人”限制更少?

ruby 公共与私人与受保护