2011-09-02 9 views
0

사용자로부터 상속 가능한 클래스 내의 일부 메서드를 숨기려고합니다. 예를 들어 :상속 클래스 내에서 public 메서드를 숨기는 방법

public class Test extends TextView { 

    public Test(Context context) { 
      super.onCreate(context); 
    } 

    /* hide this method */ 
    @Override 
    protected void setText(CharSequence text) { 
      super.setText(text); 
    } 
} 

그리고 내가 테스트 클래스 내에서이 방법을보고 싶지 않아. 어떻게해야합니까? 죄송합니다 내 영어

+0

어떻게 숨기시겠습니까? 당신이 달성하려는 것을 조금 더 설명 할 수 있습니까? – Martyn

+0

"숨기기"란 의미를 분명히하십시오. 어쨌든 super를 호출하기 만하면 그것을 제거 할 수 있고'TextView'에 공개되어 있으므로'Test' 클래스에 가질 필요가 없습니다. "숨김"을 사용하면 '비공개'로 설정하는 것이 가능하지 않습니다. 'TextView'로 public으로 정의되며 상속 된 메서드의 가시성을 줄일 수 없습니다. –

답변

0

서브 클래스에 할당 된 기본 클래스가 여전히 기본 클래스 메서드를 호출 할 수 있어야하므로 숨기기 때문에이 문제는 디자인 문제와 비슷합니다.

그러나 두 가지 중 하나를 수행 할 수 있습니다.

  1. 메소드를 사용되지 않음으로 표시하십시오. 참고 : 대개 deprecated 메소드는 b/c 메소드를 사용하지 말라고 알려주기 위해 사용됩니다. 그러나 곧 제거 될 것이지만 현재는 작동하지만 여기서는 전혀 작동하지 않습니다 (아마도) ...

    그리고 메소드에서 UnsupportedOperationException을 던집니다. 그래서 당신/다른 사람들은 그것이 불리면 그것을 일찍 붙잡습니다.

    /* 
    * @deprecated Do not call this method. 
    */ 
    @Deprecated 
    @Override 
    protected void setText(CharSequence text) { 
         throw new UnsupportedOperationException("not supported"); 
    } 
    
  2. 서브 클래 싱 대신 컴포지션을 고려하십시오. 이것은 원하는 클래스를 래핑하고 원하는 것을 노출하는 클래스를 만드는 것을 의미합니다. 원래 클래스와 래퍼 클래스 사이에 공통 인터페이스가 필요한 경우 인터페이스를 구현하고 사용하는 인터페이스를 만들고 새 클래스를 사용하여 인스턴스를 만듭니다.

+0

나는 두 번째 옵션을 더 좋아한다고 언급해야하지만 더 많은 작업이 필요합니다. – Sam

관련 문제