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
Güzellik, teşekkürler! – Ipsquiggle
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
İ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