2012-04-04 8 views
12

tôi có lớp học như:Làm thế nào để bọc lớp trong java và lưu giao diện?

MyClass extends MyAbstractClass implement myInterface1, myInterface2,... 

tôi cần tạo lớp mới với trường bổ sung:

MyType1 field1; 
MyType2 field2; 
....... 

Có vẻ như là đúng tạo lớp mới sẽ quấn MyClass như:

MyWrapClass { 
MyClass myClass=new MyClass(...); 
MyType1 field1; 
MyType2 field2; 
..... 

Nhưng MyWrapClass được sử dụng dưới dạng myInterface1 hoặc myInterface2!

Vì vậy, câu hỏi là: tôi có nên khai báo tất cả các phương thức cần thiết cho giao diện myInterface1, myInterface2 trong MyWrapClass không? Hoặc tồn tại một cách khác? Cảm ơn.

+0

Nếu bạn cần tạo một lớp học với trường mới thì bạn phải mở rộng lớp gốc. Có người nói với tôi rằng tốt hơn là tạo một biến Giao diện thay vì của một lớp và đó là vì bạn có thể thêm các phương thức vào một giao diện với việc thay đổi mã của toàn bộ lớp và mọi lớp sử dụng một thể hiện của lớp đó . Điều này tôi đã có thể có được một câu trả lời tốt cho nhưng nó có thể giúp đỡ với việc mở rộng các lớp học và thêm các phương pháp mới mà bạn đang muốn làm. –

Trả lời

16

Về cơ bản, có hai cách. Người đầu tiên là mở rộng các lớp cơ sở:

public class MySubClass extends MyClass { 
    private MyType1 field1; 
    private MyType2 field2; 
.... 

Lựa chọn thứ hai là sử dụng thành phần:

public class MySubClass implements myInterface1, myInterface2 { 
     private MyClass delegate; 
     private MyType1 field1; 
     private MyType2 field2; 

     // for all methods in myInterface1, myInterface2 
     public SomeType method1() { 
     return delegate.method1(); 
     } 
     ... 
} 

Lựa chọn thứ hai là khuyến cáo của nhiều Java Gurus:

cuốn sách Effective Java Josh Bloch 2nd Edition

  • Mục 16: Thành phần ưu tiên thừa kế
  • mục 17: Thiết kế và tài liệu cho các thừa kế hoặc nếu không cấm nó

Tốt hướng đối tượng thiết kế không phải là về tự do mở rộng các lớp học hiện có. Thay vào đó, bản sao đầu tiên của bạn nên được soạn thảo.

cũng Xem http://en.wikipedia.org/wiki/Composition_over_inheritance

phần trên thừa kế có thể đơn giản hóa việc thiết kế ban đầu của các lớp miền Kinh doanh và cung cấp một lĩnh vực kinh doanh ổn định hơn trong thời gian dài. Lợi thế của nó so với thừa kế là một sự cô lập hơn về lợi ích hơn là có thể được mô tả bởi một hệ thống phân cấp của các lớp hậu duệ. Ngoài ra, các mô hình kế thừa thường được tạo ra trong định nghĩa các lớp miền kinh doanh để hiểu được thông tin trong miền vấn đề và không nhất thiết phản ánh mối quan hệ thực sự của các đối tượng hệ thống khác nhau.

P.S .: tự động mã-tạo cho các thành phần được hỗ trợ bởi một số IDE hiện đại

3

Đừng quấn, chỉ cần lớp con:

class MySubClass extends MyClass { 
    MyType1 field1; 
    MyType2 field2; 
    ... 
2

Giả sử bạn không thể mở rộng MyClass, sau đó không có không có cách nào khác mà bạn có thể có MyWrapClass và sử dụng nó như MyClass. Ví dụ, nó đã xảy ra với tôi để phải thực hiện Bản đồ để bọc một bản đồ thực tế. Nó có nhiều chức năng và mỗi một trong số chúng phải được thực hiện mà bạn định sử dụng. Có một chút mất thời gian ở đây, trong đó nếu bạn không có kế hoạch chuyển nó đến một hàm mà bạn không viết, bạn có thể thêm tất cả các phương thức cần thiết và chỉ thực hiện các phương thức bạn cần. Mặc dù thường xuyên hơn không phải vậy.

Hoặc, bạn có thể viết một lớp giả để thực hiện tất cả các phương thức của giao diện gọi trình bao bọc. Sau đó, bạn có thể ghi đè lớp này bằng cách thực hiện của riêng bạn, cho phép bạn tái chế một lớp trình bao bọc mà không phải thực hiện tất cả các phương thức mỗi lần.

2

Giả sử bạn không thể mở rộng MyClass và bạn muốn để có thể sử dụng MyWrapClass as type myInterface1 hoặc myInterface2. Bạn có thể làm như sau:

MyWrapClass implement myInterface1, myInterface2,...{ 
    MyClass myClass=new MyClass(...); 
    MyType1 field1; 
    MyType2 field2; 

    methodInInterface1() { 
     myClass.methodInInterface1() 
    } 

    .... 

Bạn ủy quyền tất cả các phương pháp triển khai trong myInterface1 và myInterface2 đến MyClass. Tôi tin điều này được gọi là Thành phần.

+0

@Eugen Retunsky bạn đánh tôi với nó. chúc mừng, – hongbo