- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如四人帮在“Design Patterns”中所说:“it's often said that 'inheritance breaks encapsulation'”,在“面向对象编程语言中的封装和继承”中解释了斯奈德。
然而,每次我读到“inheritance breaks encapsulation”时,这种说法背后的原因要么是含糊不清的解释,
或者用 Fragile Base Class 的例子来解释问题。
在阅读论文时,我有一种感觉,真正打破封装的继承的唯一属性是向下调用,这是 open recursion 允许的特性。 ( dynamic dispatch on this
)并定义为“当父类(super class)方法调用在子类中被覆盖的方法时”,根据 Ruby & Leavens 在“安全创建正确的子类而不看父类(super class)代码”中的说法。
此外,开放递归显然是 Fragile Base Class 的原因问题,根据奥尔德里奇在“选择性开放递归:脆弱基类问题的解决方案”中的说法。
因此,如果脆弱基类问题是“继承破坏封装”的唯一原因,那么说 会更清楚。向下调用破坏封装 .由于一些解决方案可以在仍然使用继承的同时避免向下调用,因此继承本身并没有真正涉及破坏封装。此外,四人帮提出的摆脱继承的委托(delegate)模式也可以允许开放递归和向下调用,因为委托(delegate)人的上下文(this
)被委托(delegate)人使用(这会导致一种脆弱的委托(delegate)类问题)。
因此我的问题是:
脆弱的基类问题是说“继承破坏封装”的唯一原因吗?
最佳答案
你的问题很有趣。我倾向于同意你的看法:继承的主要问题是父级和子级之间的耦合。这种关系阻碍了父类在不破坏其子类的情况下进化的能力。
我的意思是你想问脆弱基类问题是否是违反“继承破坏封装”原则的唯一表现,对吗?
TLDR;
我相信(和你一样),如果我们在使用继承时打破封装,那么,这个强耦合问题的表现肯定会在父类的脆弱性上很明显,当它改变时会破坏它的子类。
所以,在这个意义上或解释上,我认为你可能是对的。
相反的情况不一定正确,即拥有脆弱的基类并不一定意味着您违反了继承-封装规则。
耦合是问题
我仔细阅读了你提供的同一个引用书目,这段摘录可以对这个问题有所了解。
来自设计模式:可重用面向对象软件的元素:
“ parent classes often define at least part of their subclasses’ physical representation. Because inheritance exposes a subclass to details of its parent’s implementation, it’s often said that “inheritance breaks encapsulation” [Sny86].”
"To preserve the full benefits of encapsulation, the external interfaces of a class definition should not include instance variables"
_field
)时,就会出现此类违规。
关于oop - 脆弱的基类是 "inheritance breaks encapsulation"的唯一原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51002008/
我是一名优秀的程序员,十分优秀!