oop - 对字段和方法使用私有(private)而不是 protected 原因

这是一个相当基本的 OO 问题,但一直困扰着我一段时间。

我倾向于避免对我的字段和方法使用“私有(private)”可见性修饰符,而倾向于 protected .

这是因为,一般来说,我认为隐藏基类和子类之间的实现没有任何用处,除非我想为我的类的扩展设置特定的指导方针(即在框架中)。在大多数情况下,我认为试图限制我或其他用户扩展我的类(class)的方式是没有好处的。

但是,对于大多数人来说,private在定义非公共(public)字段/方法时,修饰符通常是默认选择。

那么,您能否列出 private 的用例? ?总是使用私有(private)有一个主要原因吗?还是您也认为它被过度使用了?

最佳答案

有一些共识认为应该prefer composition over inheritance在面向对象。这有几个原因(如果您有兴趣,请谷歌),但主要部分是:

  • 继承很少是最好的工具,并且不如其他解决方案灵活
  • protected 成员/字段形成一个与您的子类的接口(interface)
  • 接口(interface)(以及关于它们 future 使用的假设)很难正确处理和正确记录

  • 因此,如果你选择让你的类可继承,你应该有意识地这样做,并考虑到所有的利弊。

    因此,最好不要使类可继承,而是通过使用其他方式确保它尽可能灵活(仅此而已)。

    这在您的类的使用超出您的控制范围的较大框架中最为明显。对于您自己的小应用程序,您不会注意到这一点,但如果您不小心,它(默认继承)迟早会咬住您。

    替代品

    组合意味着您将通过显式(完全抽象)接口(interface)(虚拟或基于模板)公开可定制性。

    因此,与其拥有一个具有虚拟 drive() 函数的 Vehicle 基类(以及其他所有内容,例如价格整数等),您将拥有一个带有 Motor 接口(interface)对象和 Motor 接口(interface)的 Vehicle 类仅公开 drive() 函数。现在您可以在任何地方添加和重复使用任何类型的电机(或多或少。:)。

    https://stackoverflow.com/questions/4913025/

    相关文章:

    vba - VBA中的子级

    c# - 具有只读哈希表的嵌套内部类在分配时引发Null ref异常。

    haskell - 如何编写map语句来比较haskell中两个列表的每个元素?

    c# - 分配的左侧必须是变量属性或索引器

    android - Android : Take numbers, do calculations,

    haskell - 尝试遍历森林 Haskell 编译错误

    oracle - 错误(3,31): PL/SQL: ORA-00984: Column is no

    c# - C#简单兴趣计算器切换错误

    c# - 为什么SubscribeOn在这里不能作为扩展方法而是直接调用?

    compiler-errors - 编程新手,无法让Visual Studio 2013打开包含文件