2013-04-16 31 views
6

Tôi có hệ thống phân cấp hoạt động này và chương trình chạy như mong đợi. Về cơ bản tôi đã tóm tắt tất cả mọi thứ trong một lớp cơ sở và tất cả các phân lớp khác thêm phương pháp riêng của họ.Mẫu thiết kế có thể áp dụng

abstract Class Base{ 
} 

class A extends Base{ 
    //new methods 
} 

class B extends Base{ 
    //new methods 
} 

tất cả mọi thứ có vẻ tốt cho đến sau này (errr ... yêu cầu mới) Tôi nhận ra tôi cần phải có một lớp mới (cho phép gọi lớp này C) kéo dài cả lớp A và B. Bây giờ, trong java của nó không thể mở rộng hai lớp bê tông.

class C extends A, B{ 
    //new methods 
} 

Tôi cần cả hai phương pháp và biến trong lớp A và lớp B nhưng tôi không biết cách thực hiện việc này? Bất kỳ gợi ý nào về cách thực hiện thay đổi này? Tôi không giỏi về mẫu thiết kế vì vậy tôi đã nghĩ đến việc hỏi nó ở đây.

Cảm ơn

CẬP NHẬT Đây thực sự là một JSF Managed Bean trong đó tôi trừu tượng hóa mọi thứ trong một cơ sở Managed Bean và tất cả các trọng lớp con khác/thêm hiện thực của riêng họ trên đầu trang của các cơ sở quản lý đậu. Có chỉ là một yêu cầu mới đã được thêm vào trong đó tôi cần các chức năng của cả lớp con (A và B) vào một lớp con mới (C)

+0

Thật khó để nói mà không cần biết thêm chi tiết về các lớp học, nhưng có vẻ như bạn nên làm tốt hơn với thiết kế dựa trên thành phần. –

+6

Bạn cần phương pháp, nhưng là mối quan hệ 'C là A và B' cần thiết? Bạn có thể sử dụng bố cục nhưng bài đăng của bạn cần thêm thông tin để biết liệu điều này có phù hợp không. –

+1

Yeh xem xét thành phần và có 'C' chứa các thể hiện của' A' và 'B'. –

Trả lời

4

Refactor mã của bạn và làm cho ABBase giao diện thay vì các lớp học và sử dụng giao tiếp thừa kế thay vì thừa kế thực hiện.
Sau đó, bạn có thể thực hiện cả hai thành phần Hoặc sử dụng AB (đây là cách đa kế thừa được hỗ trợ trong Java)

+1

Trong câu hỏi @Mark Estrada đã đề cập "Tôi cần cả hai phương pháp và biến trong lớp A và lớp B" Vì vậy, tôi đoán anh ta không thể thay đổi 'A' và' B' thành giao diện vì chúng dường như có các biến thành viên. – codeMan

+0

@codeMan: Biến thành viên không phải là vấn đề. Anh ta chỉ cần thiết kế lại mã của mình một cách chính xác. – Cratylus

+1

Và ông sẽ phải thực hiện lại tất cả các phương pháp thay vì sử dụng mã hiện tại sau đó. –

3

hoặc sử dụng lớp bên trong.

class C extends A { 
    B b = ... // this is one option 

    class D extends B { 
    // this is another option 
    } 
} 
2

Lý tưởng nhất là bạn nên tạo tất cả các lớp A, B và cơ sở như giao diện, nhưng như bạn đã đề cập rằng trên thiết kế đã được thực hiện Tôi giả định rằng đây không phải là một lựa chọn bây giờ.

Giải pháp khác là tạo một thể hiện loại A hoặc/và B trong lớp C (sáng tác).

Class C{ 
A a=new A(); 
B b=new B(); 
} 

Bạn cũng có thể sử dụng một cách tiếp cận hỗn hợp sử dụng cả hai thừa kế và thành phần như mở rộng A và tạo ra thể hiện của B.

1

Lets C chứa AB mà còn làm cho nó extend Base sau đó ủy thác, do đó bạn không phải lặp lại bất cứ điều gì.

class C extends Base 
{ 
    A a = new A(); 
    B b = new B(); 

    // Now delegate any implemented methods from Base to A and B 

    @Override 
    public void anAbstractMethod() 
    { 
     a.anAbstractMethod(); 
     b.anAbstractMethod(); 
    } 
} 
Các vấn đề liên quan