Oop 字段和方法使用private而不是protected的原因

Oop 字段和方法使用private而不是protected的原因,oop,visibility,private,protected,Oop,Visibility,Private,Protected,这是一个相当基本的OO问题,但它困扰了我一段时间 我倾向于避免对字段和方法使用“private”可见性修饰符,而倾向于使用受保护的 这是因为,一般来说,我看不到在基类和子类之间隐藏实现有任何用处,除非我想为类的扩展(即在框架中)设置特定的指导原则。对于大多数情况,我认为试图限制我的类由我或其他用户扩展的方式是没有好处的 但是,对于大多数人来说,private修饰符通常是定义非公共字段/方法时的默认选择 那么,您能列出私有的用例吗?是否有一个主要的原因总是使用私人的?或者你也认为它被过度使用了吗?

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

我倾向于避免对字段和方法使用“private”可见性修饰符,而倾向于使用受保护的

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

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


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

在默认情况下,我更喜欢私有而不是保护,因为我遵循的原则是尽可能隐藏可能性,这就是为什么将可见性设置为尽可能低的原因。

有一些共识认为在OOP中应该这样做。这有几个原因(如果你感兴趣,可以用谷歌),但主要原因是:

  • 继承很少是最好的工具,也不像其他解决方案那样灵活
  • 受保护的成员/字段构成了子类的接口
  • 接口(以及对其未来使用的假设)很难正确使用并正确记录
因此,如果您选择使您的类可继承,那么您应该简明扼要地做到这一点,并牢记所有的优点和缺点

因此,最好不要让类是可继承的,而是通过使用其他方法来确保它尽可能灵活(不再如此)

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

备选方案

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


因此,与使用带有virtual drive()函数的Vehicle基类(以及其他所有函数,如price的整数等)不同,您将使用一个Vehicle类来获取Motor接口对象,并且Motor接口仅公开drive()函数。现在,您可以在任何地方添加和重复使用任何类型的电机(或多或少。。

我正在这里。但是,我认为使用受保护的成员变量应该很简洁,因为您不仅计划继承,而且还因为派生类不应该使用在基类上定义的属性setter/getter是有充分理由的

在OOP中,我们“封装”了成员字段,这样我们就可以控制如何访问和更改它们所表示的属性。当我们在基础上为成员变量定义一个getter/setter时,我们本质上是说这就是我希望引用/使用这个变量的方式

虽然存在设计驱动的异常,其中可能需要更改基类getter/setter方法中创建的行为,但在我看来,这将是在仔细考虑备选方案后做出的决定

例如,当我发现自己需要直接从派生类而不是通过getter/setter访问成员字段时,我开始考虑也许应该将特定属性定义为抽象属性,甚至移动到派生类。这取决于层次结构的广泛程度,以及任何其他考虑因素。但对我来说,在基类上定义的公共属性周围走动开始有味道


当然,在许多情况下,这“无关紧要”,因为我们在getter/setter中实现的只是对变量的访问。但是,如果是这种情况,派生类也可以通过getter/setter轻松访问。如果一直使用,这也可以防止以后难以发现的bug。如果基类上成员字段的getter/setter的behgavior以某种方式更改,并且派生类直接引用受保护的字段,则可能会出现问题

在两种情况下,一个成员是受
保护的
还是受
保护的

  • 如果派生类可以从使用成员中获益,那么将该成员设为“protected”将允许它这样做,而将其设为“private”则会拒绝该益处。
  • 如果基类的未来版本可以通过不让成员像当前版本中那样行为而受益,那么将成员设置为“private”将允许该未来版本更改行为(或完全删除该成员),而将其设置为“protected”将要求该类的所有未来版本保持相同的行为,从而使他们无法从改变它中获得好处。 如果可以想象一个现实的场景,其中派生类可能从能够访问成员中受益,而无法想象基类可能从更改其行为中受益,那么该成员应该受到
    保护
    [当然,假设它不应该是公共的]。如果无法想象一个派生类会从直接访问成员中获得很多好处的场景,但是可以想象一个基类的未来版本可能通过更改它而受益的场景,那么它应该是
    私有的
    。这些案例非常清楚明了

    如果没有任何可能的情况下基类可以从更改成员中获益,我建议应该倾向于使其受到保护。有人会说“YAGNI”(你不需要它)原则有利于
    private
    ,但我不同意。如果你在等我