2011-05-08 41 views
5

Tôi đang cố gắng tạo ra một số lớp để kiểm soát ứng dụng mô hình xem-người trình bày. Tôi đã đưa ra các định nghĩa sau đây, nhưng tôi đang đấu tranh để tránh các loại generics đệ quy.Có thể đệ quy các Generics Java giữa hai lớp

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; 

    // ... 
} 

Tôi muốn thực thi mối quan hệ chung giữa hai lớp. Ý tưởng là tôi có thể khởi tạo một Presenter cho một View cụ thể, với cả hai lớp dựa trên các phương thức hữu ích được định nghĩa trong các lớp cơ sở trừu tượng, nhưng cả hai đều biết chính xác lớp con của lớp trừu tượng đối tác đang được sử dụng.

Vấn đề của tôi là xác định phần ..? của mã. Tôi không thể nhìn thấy một cách để tránh một tình huống đệ quy, chẳng hạn như:

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

và thậm chí định nghĩa đó là không phù hợp, như lớp View bây giờ có hai tham số chung ... nhầm lẫn khối lượng.

tôi về cơ bản muốn tránh các lớp học được rải rác với tham chiếu đến kiểu lớp trừu tượng, đòi hỏi phải rất nhiều đúc suốt triển khai cụ thể, như sau:

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

Mỗi thực hiện cụ thể của các lớp này sẽ cần phải liên tục chuyển từ kiểu trừu tượng sang kiểu "biết" đang được sử dụng.

Trả lời

1

Hãy thử

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

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

Điều này sẽ hạn chế người thuyết trình để có bất cứ quan điểm như thông số chung của họ và quan điểm để có bất cứ người dẫn chương trình.

+0

Tuyệt vời, đó là thực hiện các trick! Cảm ơn. –

3

Sử dụng một số loại thứ hai cho các loại this:

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

Sau đó, bạn có thể làm:

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

Cảm ơn bạn đã phản hồi. Thiết kế này có mang lại lợi thế so với giải pháp hiện tại không? Ngoài ra, mệnh đề '.view.presenter' có cần thiết không? –

+0

@Duncan Jones "Thiết kế này có mang lại lợi thế hơn giải pháp hiện tại không?" như @Thomas nói, "Điều này sẽ hạn chế những người thuyết trình có bất kỳ chế độ xem nào như tham số chung và quan điểm của họ để có bất kỳ người trình bày nào." Tôi tin rằng đây là câu trả lời đúng vì tôi khá chắc chắn người kia có thể có một cái lỗ kiểu, mặc dù tôi không có thời gian để chứng minh nó ngay bây giờ. – ArtB

Các vấn đề liên quan