2012-01-15 34 views
44

Để giảm dependece của lớp, tôi muốn gửi thông số (sử dụng lớp generic) để xây dựng mở rộng một số lớp và thực hiện các giao diện, ví dụlớp Generic mở rộng lớp học và dụng cụ giao diện

public interface SomeInterface{ 
    public void someMethod(); 
} 

public class MyFragment extends Fragment implements SomeInterface{ 
    //implementation 
} 

//here is classs, that I need to create. T must extend Fragment and implements 
//SomeInterface. But, I'm afraid, if I'll use MyFragment directly, it will create a 
//dependence of SomeClass from MyFragment. 

public class SomeClass /*generic?*/ { 
    public SomeClass(T parent); 
} 

Có thể?

Ngoài ra, khi sử dụng lớp T, tôi muốn tạo các khung nhìn, sử dụng T.getActivity() làm Ngữ cảnh.

+0

Bạn có thể cung cấp thêm thông tin không? Sử dụng sự phản chiếu Java, bạn có thể truyền một đối tượng 'Class' vào một phương thức và kiểm tra nó cho các giao diện được thực thi của nó thông qua' getInterfaces() ', cũng như lấy/gọi một' Constructor' để tạo một cá thể mới.Nhưng trường hợp sử dụng cụ thể của bạn không rõ ràng, vì vậy rất khó để tìm ra cách ghép các mục này lại với nhau để giải quyết vấn đề cụ thể của bạn. – Devunwired

+0

@Devunwired, đã cập nhật câu hỏi của tôi –

Trả lời

106

T phải mở rộng Fragment và thực hiện SomeInterface

Trong trường hợp đó bạn có thể tuyên bố SomeClass như sau:

public class SomeClass<T extends Fragment & SomeInterface> 

Điều đó sẽ đòi hỏi một đối tượng kiểu T cho cả hai mở rộng Fragment và triển khai SomeInterface.

Hơn nữa, sử dụng lớp T, tôi muốn tạo chế độ xem, sử dụng T.getActivity() làm Ngữ cảnh.

tôi không quen với Android, nhưng nếu getActivity() là một phương pháp dụ công khai báo trong Fragment sau đó sẽ hoàn toàn có thể gọi nó là về một thể hiện của T, vì trình biên dịch sẽ biết tất cả T s phải kế thừa phương pháp mà .

+0

+1 Đánh tôi với nó. – Devunwired

+0

Bạn sẽ sử dụng Mockito như thế nào để tạo một lớp mô hình có kiểu T? –

+1

@bwicks Câu hỏi hay. Tôi nghi ngờ lớp thử nghiệm của bạn có thể cần khai báo một kiểu như 'lớp trừu tượng TestFragment mở rộng các phần thực thi Fragment someInterface' và sau đó giả sử kiểu đó với' TestFragment.class'. –

6

Bạn có muốn làm điều gì đó như thế này không?

class SomeClass {} 

interface SomeInterface{ 
    public void someMethod(); 
} 

class AGenericClass<T> extends SomeClass implements SomeInterface { 
    public void someMethod() {} 
} 

Điều này được cho phép.

Nhưng Android cụ thể về câu hỏi của bạn là gì? Tôi nghĩ rằng tôi phải thiếu một cái gì đó để bạn có thể cung cấp một số chi tiết hơn?

cập nhật dưới đây

tôi vẫn không hoàn toàn chắc chắn những gì bạn muốn làm, và tôi cũng không chắc chắn bạn cần phải lo lắng về sự phụ thuộc ngay lập tức, nhưng điều này cũng là hợp pháp, sử dụng bounded type parameters :

interface SomeInterface{ 
    public void someMethod(); 
} 

class Fragment { 
    public void aMethodInFragment() { } 
} 

public class SomeClass <T extends Fragment & SomeInterface> { 
    public SomeClass(T parent) { 
     parent.someMethod(); 
     parent.aMethodInFragment(); 
    } 
} 

loại tham số <T extends Fragment & SomeInterface> xác định rằng T phải là một lớp con của Fragment và thực hiện SomeInterface.

+0

Đã cập nhật câu hỏi của tôi. –

4

Thật dễ dàng nếu tôi hiểu bạn sửa bạn có một số loại T đang mở rộng Phân đoạn và triển khai một số giao diện. Vì vậy, bạn phải viết một cái gì đó như thế.

abstract class TemplateFragment extends Fragment implements SomeInterface{} 

và sau đó trong lớp học của bạn

class SomeClass<T extends TemplateFragment> { 
... 
} 

Nó sẽ làm các trick.

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