2014-10-09 2 views
3

광범위하게 사용하고 메서드에서 반환하는 클래스가 있다고 가정 해 봅니다.수퍼 클래스의 인스턴스 인 객체에서 하위 클래스의 메서드 사용

CommonClass obj = getCommonObject(); 

이제 반복적 인 반복을 피하기 위해이 클래스를 확장하여 유틸리티 메서드를 만들려고합니다.

public CommonClassPlus extends CommonClass { 

    public String dontRepeatYourself() { 
     // the reason I'm creating a subclass 
    } 
} 

물론 위의 방법으로 개선 된 클래스를 사용하고 싶지만 다운 캐스팅은 허용되지 않습니다.

CommonClassPlus obj = getCommonObject(); 
//Cannot cast to CommonClassPlus 
I는 슈퍼 클래스의 인스턴스 인 객체로 작업 할 수 있다면이 방법 dontRepeatYourself() 사용 방법

?

CommonClassgetCommonObject()은 외부 라이브러리에서 가져온 것으로, 변경할 수 없습니다.

+0

PLS는 getCommonObject의 된 구현/선언을 보여준다(). – mreiterer

답변

2

, 당신은 아마 어쨌든 Adapter Pattern에 포장 할 Composition over Inheritance

이것은 당신이, 말하자면, 당신이 사용하고있는 라이브러리를 변경하려는 경우 당신에게 완벽하게 제어 할 수 있습니다, 당신은 dontRepeatYourself() 같은 기능을 추가 할 수 있습니다.

public class CommonClassAdapter implements MyAdapter { 
    private final CommonClass common; 
    private final String cachedResult; 

    // Note that I'm doing dependency injection here 
    public CommonClassAdapter(CommonClass common) { 
     this.common = common; 

     // Don't expose these because they shouldn't be called more than once 
     common.methodIOnlyCallOnce(); 
     cachedResult = common.anotherMethodIOnlyCallOnce(); 
    } 

    @Override 
    public void someMethod() { 
     common.someMethodWithDifferentName(); 
    } 

    @Override 
    public String dontRepeatYourself() { 
     return cachedResult; 
    } 
} 

참고 대부분의 현대의 IDE 빨리이 과정을 만들기 위해 Eclipse의 Source -> Generate Delegate Methods 같은 것들을 가지고.

+0

나는이 같은 올바른를 표시하고있다. – frostbite

+0

user2730785 @ 나는 다른 대답은 훨씬 더 빠르게 코드를 기존에 구현하는 것에 동의합니다. 그러나 나는이 대답으로 당신이 장기적으로 행복해질 것이라고 생각합니다. – durron597

3

자바에서 기존 인스턴스에 동작을 추가 할 수 없습니다 (예 : 자바 스크립트 에서처럼 가능).

CommonClassPlus obj = decorate(getCommonObject()); 

decorate()가이 방법은 각각의 방법을 위임해야하기 때문에 보일러의 잠재적으로 엄청난 금액을 생성

public CommonClassPlus decorate(CommonClass x) { 
    return new CommonClassPlus(x); 
} 

입니다 :

자바에서 얻을 수있는 가장 가까운는 데코레이터 패턴이다 래핑 된 인스턴스를 호출하십시오. CommonClass의 메소드가 최종적이며 다시 구현할 수있는 인터페이스가없는 경우이 방법은 모두 실패합니다.

대부분의 경우 간단한 정적 도우미 메서드와 함께 얻을 수있을 것입니다 : 원리를 이용하여, CommonClass 외부 라이브러리에서 경우

public static String dontRepeatYourself(CommonClass x) { 
    ... 
} 
+0

정적 메서드를 사용하면 실제로 문제가 해결됩니다. 감사합니다. 그것이 내가 간단한 하나가 아래에 제시하여 결국 비록 좋은 솔루션 질문에 대한 답 때문에 – frostbite

관련 문제