我看过很多文章说继承破坏了封装
http://igstan.ro/posts/2011-09-09-how-inheritance-violates-encapsulation.html
但我无法理解其背后的概念。在给定的例子中
谁能解释一下合成如何避免了这个问题
最佳答案
在文章的示例中,您链接到:
set.addAll(Arrays.asList("Snap", "Crackle", "Pop"));
这称为
InstrumentedHashSet.addAll
。InstrumentedHashSet.addAll
adds 3 to the counter, then calls
HashSet.addAll`。HashSet.addAll
调用this.add
三次,以添加每个元素。但是
this.add
实际上是对InstrumentedHashSet.add
的调用!每次调用
InstrumentedHashSet.add
都会将1加到计数器上,然后调用super.add
。每个
HashSet.add
调用都执行将元素添加到集合中的实际工作。最终结果是我们向计数器添加了6,而不是您期望的3。
为了正确实现
InstrumentedHashSet
,它需要知道HashSet.addAll
的实现方式,而不是增加addAll
中的计数器。但是,这种知识破坏了封装。子类不需要知道如何实现其超类。谁能解释一下合成如何避免了这个问题
它避免了它,因为当
HashSet.addAll
调用this.add
时,对this.add
的那些调用不是对InstrumentedHashSet.add
的调用。它们是对HashSet.add
的直接调用。实际上,只要
HashSet.addAll
实现Set.addAll
合同,InstrumentedHashSet
如何实现它就无关紧要。这里没有破坏封装。关于java - 继承破坏封装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40321009/