2012-09-10 22 views
36

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

+3

đ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

+2

đa hình mà không kế thừa là không thể trong Java – yegor256

+0

@ yegor256 đó là những gì giao diện làm –

Trả lời

39

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

+0

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

30

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ế.

3

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!

+2

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). –

+0

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. –

+2

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. –

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