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ế?
Trả lời
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.
Quy tắc tốt của ngón tay cái. –
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.
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
@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. –
@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. –
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.
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.
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.
- 1. Khi nào tôi nên sử dụng các mẫu thay vì thừa kế và ngược lại?
- 2. Có đúng không khi sử dụng thừa kế thay vì đặt bí danh tên trong C#?
- 3. Khi nào cần sử dụng Helpers thay vì Partials
- 4. Quyền thừa kế bị mất khi cấp quyền NTFS
- 5. Tiêu đề ủy quyền trong Ruby on Rails được truy cập bằng khóa HTTP_AUTHORIZATION thay vì Ủy quyền?
- 6. OpenERP luôn hiển thị xem được thừa kế thay vì
- 7. Thay đổi URL ủy quyền Omniauth
- 8. Thay đổi mã đã tạo hoặc sử dụng thừa kế?
- 9. @PrePersist với quyền thừa kế thực thể
- 10. Khi nào có quyền sử dụng Chế độ xem thay vì Chế độ xem?
- 11. C# GUI & ủy quyền sử dụng làm lớp trừu tượng
- 12. Quyền thừa kế và quyền truy cập tình bạn. C++
- 13. Sử dụng ủy quyền tùy chỉnh trong MVC 4
- 14. Mẫu thiết kế để sử dụng thay cho nhiều thừa kế
- 15. thực hiện toán tử == khi sử dụng thừa kế
- 16. Khi nào sử dụng địa chỉ (x) thay vì & x?
- 17. Khi nào sử dụng HttpApplicationState thay vì Web.Caching.Cache?
- 18. Log4net - chiến lược tối ưu khi sử dụng thừa kế
- 19. Khi nào tôi sẽ sử dụng XML thay vì SQL?
- 20. khi nào nên sử dụng index.php thay vì index.html
- 21. Khi nào sử dụng Float32Array thay vì Array trong JavaScript
- 22. Cần một khung xác thực/ủy quyền python
- 23. Ủy quyền kiểm tra bằng cách sử dụng Global.asax
- 24. Cách sử dụng thuộc tính ủy quyền trên MVC3
- 25. Có sử dụng chuyển đổi ngầm cho một upcast thay vì QueryInterface() hợp pháp với nhiều thừa kế?
- 26. Những gì cần sử dụng thay vì CONTAINS() trong CSS3
- 27. cách ủy quyền sử dụng google-api-ruby-client
- 28. Facebook Connect HOẶC Facebook Ủy quyền sử dụng OAuth 2.0
- 29. Java thừa kế vs C# thừa kế
- 30. Cách thay đổi chế độ ủy quyền SQL Server mà không cần Quản lý Studio
Thảo luận tốt tại đây: http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance –
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