2011-09-14 6 views
8

Overriding and Hiding Methods 자습서를 읽었습니다.수퍼 클래스 숨기기 방법

서브 클래스는 슈퍼 클래스의 클래스 메소드와 같은 서명 클래스 메소드를 정의하는 경우 슈퍼 클래스에서, 서브 클래스 가죽의 방법 일 : 그리고 그에서, 나는 다음과 같은 모였다. 나는이 디자인에 대해 좋아하지 않는 무엇

import javax.swing.JTextArea; 

public final class JWrappedLabel extends JTextArea{ 
    private static final long serialVersionUID = -844167470113830283L; 

    public JWrappedLabel(final String text){ 
     super(text); 
     setOpaque(false); 
     setEditable(false); 
     setLineWrap(true); 
     setWrapStyleWord(true); 
    } 

    @Override 
    public void append(final String s){ 
     throw new UnsupportedOperationException(); 
    } 
} 

append 여전히 서브 클래스의 볼 수 방법이다 :

는, 나는 다음과 같은했다. UnsupportedOperationException을 던지는 대신 몸을 비울 수있었습니다. 그러나 둘 다 추한 느낌.

그렇다면 수퍼 클래스의 메서드를 숨기는 더 좋은 방법이 있습니까?

+2

만 강조 (@Simone이 완전한 답이있다)의 경우 : ** 금지 사항 ** 슈퍼 클래스의 재정의 방법 계약을 이행하지 않고. BTW, 당신이 여기에 _instance_ 메서드를 재정의하는 동안 인용 한 문장은 _class_ 메서드에 관한 것입니다. – kleopatra

+0

@kleopatra, 나는이 질문이 더 이상주의를 끌지 않을 것이라고 느꼈기 때문에 내가 한 대답을 표시했다. 나는 아직도이 질문에 충분히 대답했다고 생각하지 않는다. 당신은 당신 자신의 것을 제공 할 수 있습니까? 당신은 지식이있는 것 같습니다! : D – mrkhrts

+0

나는 그것이 오래된 것을 알고 있지만 나는 단지 이것을 발견했다. 나는 보통 이것을하기 위해 너의 방법을 사용하는데, 나는 또한 그 방법을 final로 오버라이드하여 클래스를 확장 할 수 없다. 특정 기능을 추가로 사용 가능하게하십시오. –

답변

11

가능하면 구성을 사용하십시오. 이것은 조슈아 블로흐 (Joshua Bloch)가 Effective Java, Second Edition에 추천 한 것입니다.

항목 16 : 상속을 통해 부탁 구성 예를 들어

:

import javax.swing.JTextArea; 

public final class JWrappedLabel { 
    private static final long serialVersionUID = -844167470113830283L; 

    private final JTextArea textArea; 

    public JWrappedLabel(final String text){ 
     textArea = new JTextArea(text); 
     textArea.setOpaque(false); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 
    } 

    //add methods which delegate calls to the textArea 
} 
+0

+1, 나는 이것이 정말로 바람직하지는 않지만 제안을 고맙게 생각한다. 의미가 있지만, JWrappedLabel 인스턴스를 컨테이너에 직접 추가 할 수는 없습니다. 대신 텍스트 영역에 대해 객체를 쿼리해야합니다. 실제로는하지 않으려합니다. 그러나 구성이 유일한 다른 대안이라면, 나는 예외를 던질 것입니다. 어느 쪽이든, 최종 해결책이 오히려 못생긴 것처럼 보입니다. :/ – mrkhrts

+1

컨테이너에 JWrappedLabel을 추가 할 수있는 인터페이스를 구현하면됩니다. mrkhrts가 위에 지적한 문제를 해결할 것입니다. –

+0

@James DW, 그 점을 살펴 보겠습니다. 감사합니다! :디 – mrkhrts

3

아니요.

OOP 문제/기능입니다. 클래스는 여전히 JTextArea이므로 하위 클래스를 인식하지 못하는 코드에서 JTextArea로 취급하고 JTextArea의 모든 메소드가 거기에 있고 올바르게 작동 할 것으로 기대할 수 있습니다.

새 인터페이스를 정의해야하는 경우 JTextArea를 확장하지 않고 캡슐화하는 새 클래스를 정의해야합니다.

관련 문제