2012-01-02 25 views
7

Tôi có một nhóm các lớp mở rộng một lớp trừu tượng duy nhất. Một tập hợp con của các lớp này cần một sự implelmentation giống hệt nhau của một trong các phương thức, một tập hợp con khác của các lớp cần thực hiện một phương thức khác, và một tập con thứ ba yêu cầu một phương thức khác. Trong tất cả có khoảng mười lớp con, nhưng chỉ có ba triển khai có thể có của một trong các phương pháp. (Có nhiều phương pháp khác mà các lớp thực hiện không có điểm gì chung.)Cách thực hiện điều này mà không cần thừa kế nhiều

Tôi đang cố gắng tìm ra cách tốt nhất để thực hiện việc này. Tôi nghĩ rằng những gì tôi đã làm trong C++ là thừa kế nhiều: tạo ra các lớp bae chỉ thực hiện phương thức này, sau đó để cho các em kế thừa từ một trong ba lớp đó.

Có cách nào tốt nhất để thực hiện điều này trong Java không?

Tôi đang xem xét một lớp can thiệp gồm ba lớp trừu tượng, giữa lớp trừu tượng chính và trẻ em. Mỗi một trong ba kế thừa từ lớp trừu tượng chính và triển khai phương thức được đề cập. Sau đó, trẻ em được thừa hưởng từ bae này. Nhưng những gì tôi không thích về điều đó là gì nếu một phương pháp khác đi kèm với một hành vi "nhóm" tương tự, và nó không tương ứng với ba lớp "tầng trung lưu"? Điều đó sẽ trở nên xấu xí

Có bất kỳ điều này có ý nghĩa gì không? Tôi đang viết vội vàng ...

EDIT: Vì vậy, 24 giờ sau khi đặt câu hỏi của tôi, tôi đã nhận được khoảng một nửa mẫu để điều tra. Tôi chưa chắc chắn rằng họ là tất cả các mẫu thiết kế chính thức. Nhưng tôi sẽ xem xét và sau đó báo cáo lại (và chọn câu trả lời đúng). Các pattens gợi ý cho đến nay:

* Delegation 

* Bridge 

* Strategy 

* Composition 

* Decorator (if I was choosing on name alone, I choose this one) 

Tôi cũng cần phải nói thêm rằng các phương pháp đang được thực hiện nhu cầu truy cập vào gần như tất cả các thành viên private của lớp. Vì vậy, đó sẽ là yếu tố lớn trong sự lựa chọn của tôi.

Trả lời

3

Nếu bạn nhấn mạnh giải quyết nó thông qua kế thừa, bridge pattern từ sách GoF có thể trợ giúp ở đây (có thể hoặc không phù hợp, tùy thuộc vào mối quan tâm miền nào gây ra sự tách biệt thành ba triển khai). Cá nhân, tôi có khả năng chỉ cần đặt ba triển khai phương thức vào một lớp trợ giúp và chuyển tiếp các cuộc gọi phương thức từ các lớp (những gì JB Nizet chính xác đề cập đến như là ủy nhiệm).

+0

Cảm ơn bạn đã liên kết tôi sẽ đọc và quay lại với câu hỏi của mình. Bạn vẫn sẽ lắng nghe? Tôi là người mới ở đây. Các nhận xét được đăng lên câu trả lời có gây ra một số loại cảnh báo được gửi tới người trả lời không? –

+0

Nhận xét để trả lời kích hoạt một thông báo nhỏ, nhưng nếu bạn có câu hỏi tiếp theo, tinh thần của trang web sẽ được đăng lên trang web mới hơn (trong khi kiểm tra bản sao) thay vì yêu cầu câu trả lời tiếp theo. Meta-thảo luận như thế này có [sub-site riêng của nó] (http://meta.stackoverflow.com/) và được cau mày khi ở đây. – Barend

6

Sử dụng ủy quyền thay vì kế thừa. Có tất cả các lớp của cùng một nhóm ủy thác cho một đối tượng trợ giúp chung để thực hiện phương thức của chúng.

+0

Tôi nghĩ rằng các mô hình Bridge và Strategy cũng sôi xuống để ủy quyền. Mô hình nào phù hợp nhất với ý kiến ​​của bạn? Hay chúng ta nên làm mà không có các mẫu ở đây (như một lớp trợ giúp không phải là một khuôn mẫu của chính nó)? Tôi nghĩ người hỏi bây giờ đã để lại với nhiều câu trả lời, tất cả đều không sai ... –

+0

Mô hình chiến lược là mô hình phù hợp nhất, ngoại trừ mô hình chiến lược bao gồm tiêm một chiến lược vào một lớp. Trong trường hợp này, tôi không nghĩ rằng các lớp học phải được cấu hình từ bên ngoài. Một phương thức phải được tách ra khỏi lớp. Mọi thứ không được có tên mẫu, và phái đoàn đơn giản có thể đủ ở đây. –

+0

Đồng ý. Các mẫu rất đẹp, nhưng chúng không nên được sử dụng ở những nơi mà chúng không * hoàn toàn phù hợp. –

1

Giải pháp nhanh chóng dễ cháy mà không cần sử dụng thừa kế sẽ là trừu tượng 3 "phương pháp phổ biến" ở nơi khác, và sau đó chỉ cần lặp lại cuộc gọi phương thức.

Nếu bạn muốn thực hiện theo cách OO đẹp, hãy xem mẫu trang trí có thể giúp ích ở đây - tạo 3 lớp tiêu chuẩn thực hiện ba phương pháp đã chọn và sau đó "trang trí" chúng với các lớp học.

1

Trước tiên, hãy xem xét thay thế lớp trừu tượng bằng giao diện. Tôi không biết nếu có thể trong trường hợp của bạn.

Thứ hai, bạn có thể ủy quyền chức năng của phương pháp "nhóm" cho một lớp khác (trình triển khai). Tạo 3 lớp khác nhau với việc thực hiện phương thức (hoặc chỉ 3 phương thức khác nhau trong một số lớp) và gọi chúng từ các lớp con khi cần thiết.

Vì vậy, phương pháp "nhóm" sẽ được xác định trong mỗi lớp con nhưng nó sẽ chỉ gọi một cách rõ ràng một trong 3 trình triển khai có thể.

7

Thực ra, tôi ngửi thấy một mẫu Chiến lược ở đây.

Bạn có thể có phương pháp đó trong ủy quyền lớp cơ sở cho Chiến lược được chuyển vào khi xây dựng. Các phân lớp chỉ chuyển vào bất kỳ một bộ chiến lược nào như là một phần của công trình xây dựng. Bản thân các chiến lược có thể được đưa ra ngoài lớp học, hoặc trong nội bộ như các lớp học riêng. Điều này có thể kết thúc với các lớp học ít hơn tổng thể trong hệ thống phân cấp của bạn.

Điều đó đang được nói, có thêm mùi ở đây, ngay cả với giải pháp được đề xuất của tôi. Bạn có thể muốn suy nghĩ ở một mức độ cao hơn với các giao diện (như được đề cập bởi các giải pháp khác) và thành phần chỉ không có thừa kế. Theo thời gian, tôi đã đi đến kết luận thừa kế không phải là bạn của tôi. Ngày nay tôi tránh nó khi có thể.

+0

Một chiến lược không chỉ áp dụng cho 1 phương pháp. Tôi có thể có một chiến lược thực hiện nhiều phương pháp (nếu chúng được phân nhóm theo cách đó). Tôi cũng có thể có nhiều giao diện Chiến lược và triển khai cho từng giao diện, sau đó kết hợp chúng khi cần thiết khi xây dựng. Chỉ là một ý nghĩ. Không phải là câu trả lời hay nhất. EDIT: Đây là câu trả lời cho nhận xét đã bị xóa * trong khi * tôi đã nhập. :) – rfeak

+0

Tôi thích câu trả lời của bạn rất nhiều. Mô hình chiến lược cũng có thể được sử dụng lần thứ hai nếu một phương pháp khác cũng cần được chia sẻ giữa các lớp. – toto2

+0

Xin lỗi, tôi đã xóa nhận xét ... nó sai và câu trả lời của tôi cũng vậy. Nhưng như bạn có thể thấy từ bình luận mới hơn của tôi ở trên, tôi hoàn toàn đồng ý với bạn. – toto2

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