我看过很多文章说继承破坏了封装

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/

10-10 15:12