2010-03-09 7 views
5

Google Web Toolkit을 사용하고 있으며 일반 인터페이스 구현에 문제가 있습니다. 나는 제네릭에 익숙하지 않고 다른 사람의 코드를 여기에서 업그레이드했다.일반 인터페이스를 구현하는 클래스의 서브 클래스

다음과 같이하고 싶습니다. 특정 콜백 시나리오를 처리하기 위해 일부 로깅을 수행 한 다음 해당 구현을 서브 클래스 화하는 일반 콜백 인터페이스 구현을 원합니다.

public interface AsyncCallback<T> { 
    void MethodFromAsyncCallback(T result); 
} 

추상과 콘크리트 구현

은 다음과 같이 보일 : 콜백이

public interface MyServiceAsync { 
    public void DoSomeThing(AsyncCallback<Integer>); 
} 

에서 발사 할 필요

class CallbackBase implements AsyncCallback<Object> { 
    public abstract void doStuff(Object result); 

    public void MethodFromAsyncCallback(Object result) { 
     // IMPORTANT STUFF 
     // here are things I would like to do for all callbacks, hence the superclass. 

     // Then we do the subclass specific things. 
     doStuff(result); 
    } 
} 

class SpecificCallback extends CallbackBase 
{ 
    public void doStuff(Object result) { 
     Integer i = (Integer)result; 
     // do stuff with i 
    } 
} 

인터페이스는이 같은 것입니다 그런 다음이 모든 전화가 함께 표시됩니다.

MyServiceAsync myService = (MyServiceAsync)GWT.create(MyServiceAsync.class); 
myService.DoSomeThing(new SpecificCallback()); 

여기에 문제가 있습니다. GWT.create() 내가 만든 인터페이스를 구현하는 경우

, 그것은 AsyncCallback에게 주어진 유형이 지정된 것을 요구 따라서 DoSomething(AsyncCallback<Integer>) 정수가 아닌 객체를 만들고, (이 질문의 범위를 벗어난, 다른 유형 일치). 이것은 내 통제 범위를 벗어납니다.

DoSomething()AsyncCallback<Integer>입니다. 나는 무언가로부터 상속받은 어떤 것을주고있다. 즉 AsyncCallback<Object>이다. 제네릭으로, 상속의 개념은 다소 부러 졌을까요? , DoSomething()SpecificCallback이 요구 사항의 충족 인식 할 수 있도록 내가 함께이 개 썰매의 수 어떻게 관계를 구조화 할 수있는 방법

또는

어느 :

그래서 제 질문은 이것이다 CallbackBaseSpecificCallback 사이에서 중복 코드를 피할 수 있지만 SpecificCallbackAsyncCallback<Integer>을 직접 구현합니까?

감사합니다.

class SpecificCallback extends CallbackBase<Integer> { 
    public void doStuff(Integer result) { 
    // no need to cast 
    // do stuff with result 
    } 
} 

이 그런 다음 DoSomething 방법은을 받아들이 :

abstract class CallbackBase<T> implements AsyncCallback<T> { 
    public abstract void doStuff(T result); 

    public void MethodFromAsyncCallback(T result) { 
    // general stuff (T is a subclass of Object) 
    doStuff(result); 
    } 
} 

그런 다음 당신은 특정 콜백이처럼되고 싶어 : 나는 당신이 할 필요가 있다고 생각 무엇

답변

9

이 같은 CallbackBase을 정의하다 AsyncCallback<Integer>SpecificCallback을 수락합니다.

은 (현학적 (!) 참고는 : 자바에서 소문자로 모든 방법주세요) 그것은 가치가 무엇인지에 대한

편집

을, 나는 상속보다는 구성을 사용하도록 설계를 변경 건의 할 것입니다. 이 경우, 오히려 추상 클래스 CallbackBase를 사용하고 확장하는 대신 다음과 같이 보일 수있는 그 AsyncCallback<T>의 구체적인 구현을 사용하십시오 :

class GeneralCallbackWrapper<T> implements AsyncCallback<T> { 
    private final AsyncCallback<? super T> delegate; 

    public GeneralCallbackWrapper(AsyncCallback<? super T> delegate) { 
    this.delegate = delegate; 
    } 

    public void MethodFromAsyncCallback(T result) { 
    // general stuff here 
    delegate.MethodFromAsyncCallback(result); 
    } 
} 
+0

아름다움을, 감사합니다! – Ipsquiggle

+0

Re : 편집. 그렇습니다. 많은 의미가 있습니다. 나는 그것을 처음에 그런 것으로 바꾸고 싶었지만 한 번에 한 단계 씩 혼란을 해결할 것이라고 생각했습니다. ;) – Ipsquiggle

+0

가능한 두 가지 유형을 설명하기 위해 이들 중 하나를 확장 할 수 있습니까? 예 : 개념적으로 '구현 AsyncCallback , AsyncCallback '? – Ipsquiggle

관련 문제