2010-07-17 66 views
0

上面的解释非常好。关于super关键字的混淆;在Java中实现的装饰模式

然而,我通过稍微修饰模式的执行(DEP)混淆在

http://www.netobjectives.com/resources/books/design-patterns-explained/java-code-examples/chapter17/#17-1

给出上面链接代码的设计是在给定tinypic.com/view.php?pic= xnaqlt & s = 3

我很困惑“super.callTrailer();”在装饰类Header1,Header2,Footer1和Footer2中,都是从TicketDecorator派生的。

不应该只是“callTrailer();” ?由于“private Component myTrailer;”行,每个装饰器对象都有自己对下一个装饰器的引用。

注:我不是很熟悉Java和初学者设计模式。

+0

你看过http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/IandI/super.html吗? – barrowc 2010-07-17 16:32:13

+0

谢谢,我已经通过了它,这是主要出现在搜索中的东西;即当派生类“覆盖”该方法时,它用于访问派生类中的父方法。这里的派生类不会覆盖它! – Imran 2010-07-17 17:05:48

回答

2

他们都会给你同样的结果。由于callTrailer()仅存在于父类中,因此自己调用callTrailer()将自动调用TicketDecorator的callTrailer()。我想他们超级的原因是要明确说明它正在调用父母的方法。

+0

谢谢。 但是..如果一个类B从A派生而来,并且A有一个方法x()。 B没有定义(覆盖)x()。所以现在B也是一个可以访问B的任何成员的方法x()。我的意思是x()是B的一个实例方法。 – Imran 2010-07-17 17:09:05

+0

@Imran - 如果没有覆盖,那么如果你在B上调用x(),它将调用A上的那个。 – 2010-07-17 17:15:57

+0

ok。可以说x()修改一个私有成员“pv”。正如你所说的x()被称为是A.在哪个“pv”被修改? A中的“pv”或B中的“pv”? – Imran 2010-07-17 17:24:47