继承破坏封装?

Jon*_*Jon 5 oop encapsulation access-modifiers

人们说继承破坏了封装,我同意。他们说授权更好-尽管授权中的修饰语也可以是公共的/受保护的。

那么,由于超类的公共/受保护修饰符的“敲响”作用暴露于扩展当前子类的任何新类中,因此继承中断封装的真正原因是吗?

Sid*_*Sid 5

是的。由于它使派生类可以访问基类的成员(取决于哪种语言和哪种继承),因此据说它破坏了封装。恕我直言,这仅在您坚持以最严格的条件进行封装时才适用。恕我直言,可以合理地说您接受派生类作为基类的扩展,因此以某种方式相关,并没有真正破坏封装。纯粹主义者会不同意这一点。

看看http://www.ccs.neu.edu/research/demeter/papers/context-journal/node17.html并搜索“breaks”以获得学术解释。

  • 派生类只有在被允许(通过“protected”访问修饰符)的情况下才能直接操作基类的数据。如果您将私有字段错误地标记为受保护,那么就是您的设计被破坏了。 (3认同)
  • 即使在纯粹的意义上,继承也不会破坏封装。如果这些成员被封装并且无法从派生类访问,它们就不会是公共/受保护的。 (2认同)
  • @MooingDuck 看一下我答案中的链接。人们普遍认为继承打破了纯粹意义上的封装。 (2认同)
  • “如果允许派生类访问从基类继承的成员,则基类中的更改可能也需要对派生类进行维护。” 如果允许实现更改通过接口泄漏,这是否适用于任何类的 _any_ 消费者?我发现引用来源中的论点很弱。 (2认同)
  • @Douglas “继承破坏封装”的学术论点是关于完全拥有“受保护”成员的能力。能够这样做的想法,即使是故意的,也是 OOP 纯粹主义者说继承破坏封装的原因。 (2认同)