2010-07-17 3 views
0

위의 설명은 매우 좋습니다.슈퍼 키워드에 대한 혼란; Java에서 구현 된 Decorator Pattern

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

에서 제시된

그러나, 약간 데코레이터 패턴의 구현 (DEP) 혼란하고 상기 연결 코드 설계는 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

+0

고마워, 나는 그것을 통해 가서 그것은 주로 검색에 나타났습니다; 즉 파생 클래스가 메서드를 "오버라이드"할 때 파생 클래스에서 부모 메서드에 액세스하는 데 사용됩니다. 여기에서 그것을 파기하지 않는 파생 된 클래스! – Imran

답변

2

둘 다 동일한 결과를 제공합니다. callTrailer()는 부모 클래스에만 존재하기 때문에 callTrailer()를 호출하면 자동으로 TicketDecorator의 callTrailer()가 호출됩니다. 나는 거기에 super를 두는 이유가 그것이 부모의 방법이라고 부르고 있다는 것을 명백하게하는 것입니다.

+0

감사. 하지만 .. 클래스 B가 A.에서 파생 된 경우 A에 x() 메서드가 있습니다. B는 x()를 정의하지 않습니다. 그래서 B는 B의 멤버들에게 접근 할 수있는 x() 메소드입니다. 맞습니까? 제 말은 x()가 B의 인스턴스 메소드입니다. – Imran

+0

@Imran - 오버라이드가없는 경우 B에서 x()를 호출하면 A에있는 x를 호출합니다. –

+0

ok. x()가 private 멤버 인 "pv"를 수정한다고 말할 수 있습니다. 그리고 U가 말하는 것처럼 x()는 A.의 "pv"가 수정 된 것입니다. A의 "pv"또는 B의 "pv"? – Imran