2012-01-26 21 views
6

thể trùng lặp:
Guice with parentsSử dụng Guice, làm cách nào để chèn các tham số hàm tạo của lớp siêu hạng?

class Book{string title;} 
class ChildrensBook extends Book{} 
class ScienceBook extends Book{} 

tôi muốn tiêm đầu sách vào lớp con, ví dụ, childrensBook nên được gán danh hiệu "Alice in Wonderland" và ScienceBook nên nhận được "Về nguồn gốc của loài". Làm thế nào tôi có thể thực hiện điều này với Guice?

(Lưu ý rằng tôi không muốn ghi đè lên các lĩnh vực title trong subclass)

+2

Là nó thực sự như thế nào các lớp được định nghĩa? Bạn có thể sửa đổi mã nguồn của ba lớp này hay không? Bạn có quyền truy cập vào setter cho trường màu trong các lớp con không? –

Trả lời

0

Tốt nhất có lẽ được viết các nhà thầu lớp con với các chú thích tham số khác nhau - một cái gì đó giống như

class ChildrensBook extends Book { 
    @Inject ChildrensBook (@AliceInWonderland String title) { 
    super(title); 
    } 
} 
+1

Hãy giải thích ý kiến, xin vui lòng? –

5

Trước đây hỏi và answered here:

Buried trong phần Minimize Mutability của Best Practices Guice, bạn sẽ tìm thấy hướng dẫn này:

Lớp con phải gọi super() với tất cả các phụ thuộc. Điều này làm cho tiêm xây dựng cồng kềnh, đặc biệt là khi các cơ sở tiêm thay đổi lớp học.

Trên thực tế, đây là cách để làm điều đó bằng tiêm constructor:

public class TestInheritanceBinding { 
    static class Book { 
     final String title; 
     @Inject Book(@Named("GeneralTitle") String title) { 
     this.title = title; 
     } 
    } 
    static class ChildrensBook extends Book { 
     @Inject ChildrensBook(@Named("ChildrensTitle") String title) { 
     super(title); 
     } 
    } 
    static class ScienceBook extends Book { 
     @Inject ScienceBook(@Named("ScienceTitle") String title) { 
     super(title); 
     } 
    } 

    @Test 
    public void bindingWorked() { 
     Injector injector = Guice.createInjector(new AbstractModule() { 
     @Override protected void configure() { 
      bind(String.class). 
      annotatedWith(Names.named("GeneralTitle")). 
      toInstance("To Kill a Mockingbird"); 
      bind(String.class). 
      annotatedWith(Names.named("ChildrensTitle")). 
      toInstance("Alice in Wonderland"); 
      bind(String.class). 
      annotatedWith(Names.named("ScienceTitle")). 
      toInstance("On the Origin of Species"); 
     } 
     }); 
     Book generalBook = injector.getInstance(Book.class); 
     assertEquals("To Kill a Mockingbird", generalBook.title); 
     ChildrensBook childrensBook = injector.getInstance(ChildrensBook.class); 
     assertEquals("Alice in Wonderland", childrensBook.title); 
     ScienceBook scienceBook = injector.getInstance(ScienceBook.class); 
     assertEquals("On the Origin of Species", scienceBook.title); 
    } 
} 
+0

-1, xin lỗi. Trang mà bạn liên kết không nói những gì bạn yêu cầu; bạn đã kéo một báo giá ra khỏi bối cảnh theo cách làm thay đổi đáng kể ý nghĩa của nó. Kết quả là, bạn đang đề xuất một cách tiếp cận cụ thể được gọi là kém hơn so với nguồn đó. – ruakh

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