2010-03-09 22 views
5

Google Web Araç Takımı ile çalışıyorum ve genel bir arabirimi uygulamada sorun yaşıyorum. Ben jenerik ile aşina değilim, burada başkasının kodunda bir yükseltme yapıyor.Genel bir arabirimi uygulayan bir sınıfın alt sınıfları

Yapmak istediklerim: Belirli bir oturum açma senaryosunu ele almak için, bazı oturum açma yapan genel bir geri çağırma arabiriminin uygulanmasını istiyorum ve bu uygulamayı alt sınıflara ayırmak istiyorum.

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

soyut ve somut uygulamalara

şuna benzer: geri aramaları

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

ateş gerekmektedir

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 
    } 
} 

arayüzü böyle bir şeydir Ve sonra hepsi şöyle görünüyor:

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

Ve burada bir sorunumuz var! GWT.create() benim yarattığım arabirimini uyguladığında

, bu AsyncCallback verilen tip belirtildiğinden talepleri dolayısıyla DoSomething(AsyncCallback<Integer>) bir tamsayı yerine bir nesne haline (Bu soru kapsamı dışında, başka yerde bir türü ile eşleşen). Bu benim kontrolümün ötesinde.

DoSomething()'un AsyncCallback<Integer> numaralı telefondan aldığını iddia ediyor. AsyncCallback<Object> olan bir şeyden miras alan bir şey veriyorum. Sanırım jeneriklerle miras kavramı biraz kırılıyor mu? , DoSomething() o SpecificCallback bu gereksinimleri var karşıladığını tanıyabilmesi için ben birlikte bu lapa nasıl ben ilişkiyi yapılandırabilirsiniz nasıl

veya

Ya:

Benim soru şudur CallbackBase ve SpecificCallback arasında çift kod önlenir, ancak SpecificCallback doğrudan AsyncCallback<Integer> uygular?

Teşekkürler.

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

Sonra DoSomething yöntem, bir kabul ettiği:

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); 
    } 
} 

Sonra belirli geri aramaları bu gibi olmak istiyorum: Ben yapmanız gereken düşünmek ne

cevap

9

böyle CallbackBase tanımlamaktır AsyncCallback<Integer>, SpecificCallback kabul eder.

(bilgiçlik sidenote: Java küçük harfler ile tüm yöntemleri başlayın) buna değer ne için

Düzenleme

, ben miras yerine kompozisyonu kullanmak için tasarımını değiştirerek öneririm. Bu durumda, daha ziyade soyut bir sınıf CallbackBase kullanarak ve onu uzanan yerine, şuna benzer olabilir AsyncCallback<T> somut bir uygulama kullanmak istiyorum:

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

Güzellik, teşekkürler! – Ipsquiggle

+0

Re: edit. Evet, bu çok mantıklı. İlk etapta böyle bir şeye dönüştürmek istedim, ama bir anda karışıklığımı ele alacağımı düşündüm. ;) – Ipsquiggle

+0

İki olası türü hesaba katmak için bunlardan birini uzatmak mümkün mü? Örneğin. kavramsal olarak eşdeğerdir, AsyncCallback , AsyncCallback '? – Ipsquiggle

İlgili konular