2009-05-07 20 views
37

Ai đó có thể giải thích khi nào tôi muốn sử dụng ủy quyền thay vì thừa kế?Khi nào cần sử dụng ủy quyền thay vì thừa kế?

+5

Thảo luận tốt tại đây: http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –

+1

Tôi sẽ không mở rộng câu trả lời được đưa ra, tuy nhiên một cuốn sách tôi thấy hữu ích với các loại Vấn đề thiết kế OO là cuốn sách tuyệt vời của Arthur Riel ** Heuristics thiết kế hướng đối tượng **. http://www.davegardner.me.uk/reading/oo-design-heuristics/ http://www.amazon.co.uk/Object-oriented-Design-Heuristics-Arthur-Riel/dp/020163385X – Dave

Trả lời

46

Khi bạn muốn "sao chép"/Hiển thị API của lớp cơ sở ", bạn sử dụng kế thừa. Khi bạn chỉ muốn "sao chép" chức năng, hãy sử dụng ủy quyền.

Một ví dụ về điều này: Bạn muốn tạo một Ngăn xếp trong Danh sách. Stack chỉ có pop, push và peek. Bạn không nên sử dụng thừa kế cho rằng bạn không muốn push_back, push_front, removeAt, et al.-loại chức năng trong một ngăn xếp.

+2

Quy tắc tốt của ngón tay cái. –

24

Chúng không liên quan gì đến nhau. Phái đoàn là một hành vi. Thừa kế là một kỹ thuật mô hình.

Thừa kế là để lập mô hình "is-a". Một máy tính "là một" hệ thống điện tử.

Ủy quyền là phương thức cung cấp kết quả. Đôi khi một đối tượng sẽ ủy nhiệm công việc cho một đối tượng khác. Đoàn có thể thông qua bất kỳ mối quan hệ nào - bạn có thể ủy quyền cho một lớp cha, cho một thành viên của tổng hợp hoặc tổng hợp hoặc bất kỳ mối quan hệ nào.

+3

Thừa kế là để mô hình hóa mối quan hệ "là-a" nhưng cũng là nơi lớp con mở rộng chức năng của lớp cơ sở và không làm gì để hạn chế nó. – ChadD

+0

@Chadworthington: Không đúng; một lớp con có thể ghi đè lên các phương thức và thay thế chúng - về cơ bản là một hạn chế - mà không ủy thác lại cho lớp cha. –

+1

@S.Lott: Trong khi bạn có thể ghi đè lên các phương thức, bạn phải cẩn thận để ghi đè lên tất cả các phương thức vạch trần hành vi mà bạn muốn hạn chế - bao gồm một số phương thức có thể chưa được viết. Lời khuyên của @ Chadworthington an toàn hơn, đặc biệt là khi bạn không kiểm soát siêu lớp. –

4

Bạn có thể sử dụng ủy quyền cho nhiều phiên bản lớp bên trong để đơn giản hóa chức năng của chúng thành một nhóm chung. Nếu ngôn ngữ của bạn không thực hiện nhiều thừa kế ví dụ bạn có thể kế thừa từ một trong các cơ sở và bọc các cơ sở khác, ủy quyền cho chức năng bạn muốn trưng ra cho việc triển khai cơ bản. Thừa kế cũng gắn kết lớp của bạn vào hệ thống phân cấp của các lớp mà bạn đang kế thừa từ vị trí như với ủy nhiệm, bạn có thể giữ vị trí của mình trong hệ thống phân cấp của riêng bạn và ủy quyền các cuộc gọi đến một hệ thống khác.

3

Giả sử lớp học của bạn được gọi là B và có nguồn gốc/giao cho lớp được gọi là A sau đó

Dưới đây là một số ví dụ khi thừa kế hoặc đoàn đang được sử dụng:
Nếu

  • bạn muốn bày tỏ mối quan hệ (is-a) sau đó bạn muốn sử dụng thừa kế.
  • bạn muốn có thể chuyển lớp học của mình sang API hiện tại đang mong đợi A, sau đó bạn cần sử dụng kế thừa.
  • bạn muốn nâng cao A, nhưng A là cuối cùng và không thể được phân loại thêm sau đó bạn cần sử dụng bố cục và ủy quyền.
1

Theo tôi, phái đoàn có thể được gọi khi đến lúc sử dụng và kế thừa được nhúng vào bao giờ hết.

Lấy the in_threads gem ví dụ, nó sử dụng trình ủy nhiệm InThreads để triển khai các chuỗi cho bất kỳ mô-đun Ruby Enumerable nào. Với điều này, chỉ gọi các phương thức in_threads trên một mảng, nó sẽ chạy trong các luồng.

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