Tôi đã được hỏi trong một cuộc phỏng vấn làm thế nào bạn có thể đạt được đa hình năng động mà không cần mở rộng một lớp học. Điều này có thể giải quyết như thế nào?làm thế nào để đạt được đa hình năng động mà không cần mở rộng một lớp
Trả lời
Decorator design pattern khai thác encapsulation là những gì bạn đang tìm kiếm.
Polymorphism thông qua thừa kế:
class Cat {
void meow() {
// meow...
}
}
class Lion extends Cat {
}
Polymorphism qua đóng gói (Decorator pattern):
interface Cat {
void meow();
}
class Lion implements Cat {
private Cat cat;
void meow() {
this.cat.meow();
}
}
ps. Thông tin thêm về người trang trí: http://www.yegor256.com/2015/02/26/composable-decorators.html
Trong nhận xét của bạn cho OP, bạn nhà nước, _polymorphism mà không thừa kế là không thể trong Java_, nhưng ở đây bạn đưa ra một ví dụ về đa hình thông qua đóng gói. Ví dụ này có mâu thuẫn với tuyên bố trước đó không? – jaco0646
Giải pháp đơn giản là viết một lớp thực hiện giao diện thay vì mở rộng một lớp cơ sở.
Một giải pháp khác là tạo proxy động ... cơ bản là cách thông minh để triển khai giao diện mà không viết rõ ràng lớp. Xem chi tiết Proxy
javadoc.
Và có, đây là (hoặc có thể là) ví dụ về mẫu trang trí, mặc dù điều quan trọng ở đây là các kỹ thuật triển khai chứ không phải là mẫu thiết kế.
Theo kinh nghiệm của tôi, trong hầu hết các cuộc phỏng vấn việc làm, các câu hỏi không tìm kiếm câu trả lời quá phức tạp, và hầu hết thời gian chỉ là câu hỏi phức tạp, vì vậy nếu họ yêu cầu cụ thể cho đa hình mà không mở rộng lớp học :
Vâng, bạn có thể có đa hình động bằng cách thực hiện một giao diện chứ không phải là mở rộng một lớp
sau đó nếu họ sẽ yêu cầu thêm nhiều lựa chọn sau đó nó sẽ là ok để đưa lên các proxy, mô hình hay cái gì khác.
Hy vọng điều đó sẽ hữu ích!
Một người phỏng vấn tốt sẽ cố gắng tìm hiểu 1) số lượng bạn biết và 2) cho dù bạn biết cách chọn giải pháp thích hợp và 3) liệu bạn có thể giao tiếp tốt hay không. Vì vậy, có, cách đúng để trả lời điều này là cung cấp giải pháp đơn giản và * gợi ý * rằng có các giải pháp khác và các mẫu thiết kế có liên quan. Câu trả lời "dài và thay đổi" trong đó một câu trả lời ngắn là cần thiết/dự kiến cho thấy các kỹ năng giao tiếp kém (IMO). –
Nhưng tôi nên thêm rằng tôi đọc Câu hỏi này khi yêu cầu thông tin kỹ thuật, không phải để được tư vấn về những gì cần nói trong ngữ cảnh phỏng vấn. –
Câu trả lời 'A' dài và thay đổi ', trong đó một câu trả lời ngắn là cần thiết/dự kiến cho thấy kỹ năng giao tiếp kém (IMO).'; hoặc thiếu kiến thức, phải không? Và sự khác biệt đó là quan trọng (IMO). Nó có thể là trường hợp nó chi phí nhiều tiền hơn cho công ty để tăng kỹ năng giao tiếp của một ai đó hơn để dạy cho họ một số mẫu thiết kế java. –
- 1. iOS: làm thế nào để có được kích thước hình ảnh mà không cần mở nó
- 2. Override hàm mà không cần mở rộng các lớp
- 3. Làm thế nào để hiển thị một thông Toast từ một lớp học mà không mở rộng Hoạt động
- 4. QT nhận được độ phân giải màn hình mà không cần màn hình mở rộng
- 5. Làm thế nào để XML serialize mảng đa hình mà không cần gói yếu tố
- 6. Làm thế nào để đạt được mặt nạ UIView động?
- 7. Làm thế nào để mở rộng một lớp trong python?
- 8. Làm thế nào để gọi một phương thức mở rộng chung một cách năng động?
- 9. Làm thế nào để mở rộng lớp BaseDaoImpl của ORMLite trên Android để mở rộng chức năng
- 10. Làm thế nào để lên lịch một sự kiện trong python mà không cần đa luồng?
- 11. Làm thế nào để ghi đè/mở rộng một lớp bên trong từ một lớp con?
- 12. Python | Làm thế nào để tạo ra năng động và có thể mở rộng từ điển
- 13. Lớp động mở rộng
- 14. PHPUnit: Làm thế nào để khẳng định rằng một lớp mở rộng một lớp khác?
- 15. Làm thế nào để mở rộng một complexType lựa chọn mà không cần giải trình tự lựa chọn?
- 16. Làm thế nào để đạt được `git --no-ff --ff-only` mà không được phép
- 17. Làm thế nào để mở rộng Python lớp init
- 18. Làm mới hoạt động mà không cần mở lại?
- 19. Xuất chức năng để DLL mà không cần lớp
- 20. PHP: Lớp mở rộng có cần một 'sử dụng' khác để gọi vùng tên không?
- 21. Rails động cơ mở rộng chức năng
- 22. Làm thế nào để có được loại lớp mà không cần khởi tạo đối tượng?
- 23. Redirect .php url url mà không cần mở rộng
- 24. Làm thế nào để đạt được chức năng INotifyPropertyChanged cho các giá trị trong một bool []?
- 25. Khả năng mở rộng là System.Threading.Timer như thế nào?
- 26. Mảng đa chiều trong Java mở rộng lớp nào?
- 27. Tôi có thể mở rộng lớp Ruby để hoạt động như OpenStruct động không?
- 28. Làm thế nào để mở rộng một mô hình từ mô hình tùy chỉnh trong CodeIgniter
- 29. Có thể đạt được kết hợp mở rộng MAX (Như, Quảng cáo) không?
- 30. Làm cách nào để mở rộng scala.swing?
đa hình mà không mở rộng một lớp hoặc đa hình mà không thừa hưởng? – Santosh
đa hình mà không kế thừa là không thể trong Java – yegor256
@ yegor256 đó là những gì giao diện làm –