2011-05-08 20 views
5

Model görüntüleme sunucusu uygulamasını kontrol etmek için bazı sınıflar üretmeye çalışıyorum. Ben aşağıdaki tanımlarla geldim, ama özyinelemeden kaçınmak için mücadele ediyorum.İki sınıf arasındaki olası yinelemeli Java jenerikleri

public abstract class Presenter<V extends View<...?>> { 

    protected V view; 

    public Presenter(V view) { 
    this.view = view; 
    } 

    // ... 
} 


public abstract class View<P extends Presenter<...?>> { 

    protected P presenter; 

    // ... 
} 

İki sınıf arasında karşılıklı bir ilişki kurmak istedim. Bir Presenter'ı belirli bir Görüş için hazırlayabilmem, her iki sınıf da soyut temel sınıflarında tanımlanan yararlı metotlara dayanmaktaydı, ancak ikisinin de tam anlamıyla sınıfın hangi alt sınıfının kullanıldığını bilerek.

Sorunlarım, kodun ..? bölümünü tanımlamaktadır. Görünüm sınıfı şimdi iki jenerik parametreleri ... kitle karışıklık alır gibi

public abstract class View<P extends Presenter<V>, V extends View<Q>, Q extends...> 

ve hatta o tanımıdır tutarlı değildir: Ben gibi bir özyinelemeli durumu önlemek için bir yol göremiyorum.

// simpler option 

public abstract class Presenter { 

    protected View view;  

    public Presenter(View view) { 
    this.view = view; 
    } 
} 

public class FooPresenter extends Presenter { 

    public FooPresenter(BarView view) { 
    super(view); 
    } 

    public someMethod() { 
    ((BarView) getView()).viewSpecificMethod(); 
    } 
} 

Bu sınıfların her biri somut uygulama sürekli gerekir:

Ben temelde aşağıdaki gibi somut uygulamaları boyunca döküm sürü gerektiren soyut sınıf türü referanslarla doludur edilen sınıfları kaçınmak istedi soyut türden "bilir" türüne göre kullanılır.

cevap

1

herhangi sunum için onların jenerik parametresi ve görüntülemeler gibi görünüm için sunum kısıtlayacak

public abstract class View<P extends Presenter<? extends View<?>>> 

Bu

public abstract class Presenter<V extends View<? extends Presenter<?>>> 

ve

deneyin.

+0

Mükemmel, bu numarayı bitti! Teşekkürler. –

3

this türü için ikinci bir tip parametresini kullanın:

class Presenter<P extends Presenter<P,V>, V extends View<P,V>> { 
    V view; 
} 

class View<P extends Presenter<P,V>, V extends View<P,V>> { 
    P presenter; 
} 

class MyPresenter extends Presenter<MyPresenter, MyView>{} 

class MyView extends View<MyPresenter, MyView>{} 

Sonra yapabilirsiniz:

MyPresenter mp = new MyPresenter().view.presenter; 
+0

Yanıt için teşekkürler. Bu tasarım mevcut çözüm üzerinde avantajlar sunuyor mu? Ayrıca, '.view.presenter' yan tümcesi gerekli? –

+0

@Duncan Jones "Bu tasarım mevcut çözüm üzerinde avantajlar sunuyor mu?" @Thomas, "Bu, sunum yapanların jenerik parametresi ve herhangi bir sunumcuya yönelik görüşleri olarak herhangi bir görüşe sahip olmalarını kısıtlayacaktır." dedi. Bu doğru cevap olduğuna ikna oldum, çünkü şu anda bunu kanıtlamak için zamanım olmasa da, diğerinin bir tür deliğe sahip olabileceğinden eminim. – ArtB

İlgili konular