2016-04-11 24 views
7

Hôm nay tôi đã có một cuộc phỏng vấn cho vị trí kỹ nghệ phần mềm. Tôi đã đọc nhiều thứ từ stackoverflow cho cuộc phỏng vấn. Họ hỏi tôi về những điều bình thường được thực hiện với OOP. Nhưng họ cũng đã hỏi tôi về những điều sau:Thừa kế có cần thiết cho việc đóng gói, trừu tượng và đa hình?

Việc đóng gói có thể không có thừa kế?

Có thể tóm tắt mà không cần thừa kế không?

Tính đa hình có thể không có thừa kế không?

Tôi đã trả lời những điều này theo kiến ​​thức của tôi về OOP. Tôi không biết nó đúng hay sai. Bất cứ ai có thể cho tôi biết câu trả lời đúng của những điều này với một số ví dụ liên quan.

Cảm ơn

Trả lời

3
  • là Encapsulation càng tốt mà không thừa kế?

Có, bởi vì Encapsulation là khả năng ẩn thuộc tính lớp học từ thế giới bên ngoài bằng phương pháp truy cập.

  • Có thể tóm tắt mà không thừa kế không?

Vâng, trừu tượng có thể đề cập đến nhiều điều, nhưng nói về OOP: Không, lớp trừu tượng không thể được sử dụng trực tiếp, bạn chỉ có thể khởi tạo các lớp kế thừa.

  • Tính đa hình có thể không thừa kế không?

Có, đa hình là việc xây dựng một giao diện duy nhất cho một số loại đối tượng, ví dụ, một cuộc gọi hàm có thể nhận các loại hoặc kiểu dữ liệu khác nhau làm đối số. Họ có thể được thừa kế hay không.

+0

Vì vậy, trong đóng gói. Bạn đang nói rằng bạn có một lớp học trong đó bạn có tất cả các phương pháp và bạn muốn che giấu điều đó từ bên ngoài thế giới? đúng? thì phương pháp truy cập của bạn ở đâu? Nếu nó trong cùng một lớp học? thế thì không phải họ đang bỏ ẩn? –

+0

Tôi có nghĩa là bạn muốn ẩn các thuộc tính của lớp hoặc cá thể từ thế giới bên ngoài, vì vậy bạn xây dựng các phương thức (setters, getters, vv) để tránh truy cập trực tiếp vào chúng. Đó là đóng gói. – manolonte

+0

Phần "v.v" là cần thiết. Một số người tin rằng đóng gói chỉ là cung cấp getters và setters mà không nhận ra rằng nó thực sự là về việc kết hợp dữ liệu với nhau và hành vi liên quan của nó (tức là các phương thức sử dụng dữ liệu đó). [http://www.javaworld.com/article/2075271/core-java/encapsulation-is-not-information-hiding.html](http://www.javaworld.com/article/2075271/core-java/ encapsulation-is-not-information-hide.html) – Piovezan

2

Đóng gói chắc chắn là có thể không có thừa kế. Đóng gói là khái niệm ẩn dữ liệu từ các đối tượng bên ngoài mà không thể thao tác nó. Một ví dụ về đóng gói sẽ là các trường riêng của một đối tượng trong Java. Sau đó, bạn có thể sử dụng các phương thức công khai (chẳng hạn như getters và setters hoặc các phương thức tính toán khác) để thao tác dữ liệu chỉ khi cần thiết. Tuy nhiên,

Sự trừu tượng và đa hình có liên quan trực tiếp đến thừa kế.

Sự trừu tượng là khi bạn lấy đi các chi tiết triển khai của một đối tượng và tạo một lớp trừu tượng hoặc một giao diện (nói về Java). Điều này sẽ hoạt động như một hợp đồng cho những gì thực hiện hoặc kế thừa lớp học sẽ cần phải bao gồm trong việc thực hiện chi tiết. Lớp trừu tượng sẽ có chữ ký phương thức, nhưng không có thân thể; lớp kế thừa sẽ triển khai thực thể.

Đa hình là khả năng triển khai nội dung trừu tượng dưới các hình thức khác nhau. Ví dụ, nếu bạn có một lớp trừu tượng được gọi là Animal có chứa một phương thức speak(), bạn có thể tạo một lớp Dog kế thừa từ Animal và thực hiện nói() để in "woof", trong khi lớp Cat() sẽ thực hiện nói () để in "meow".

Lưu ý rằng nó phụ thuộc vào loại đa hình nào đang được kiểm tra.Bạn có thể, như đã nêu trong một câu trả lời khác, có phương thức đa hình tham số hàm/hàm, và như đã nói, có thể không có thừa kế.

0

Vâng, sự hiểu biết của tôi:

  • Encapsulation chỉ là một ý tưởng để ngăn ngừa thay đổi trực tiếp với nhà nước một dụ, nó có thể được thực hiện ngay cả khi không OOP.

  • Trừu tượng là khái quát hóa các lớp (mẫu đối tượng), nó không thể được thực hiện mà không cần thừa kế. Nó tập trung vào các điều khoản hợp đồng chung.

  • Đa hình có nghĩa là hành động tương tự nhưng hành vi khác nhau. Thông thường, nó hoạt động với Abstraction/Interfaces. Nó không thể được thực hiện mà không OOP

+0

mà không có OOP hoặc không có kế thừa? –

+0

không thừa kế và có, ngay cả khi không có OOP. –

0
  • Encapsulationcàng tốt mà không thừa kế:

    chỉ cần thêm thuộc tính riêng để một lớp và sử dụng setter và getter để truy cập thuộc tính này.

  • Abstraction bởi nó tự là càng tốt mà không thừa kế: Bạn có thể tạo một lớp trừu tượng và nó không đòi hỏi bất kỳ thừa kế.

Nếu câu hỏi hỏi là: một lớp trừu tượng có thể được sử dụng mà không thừa kế?

Sau đó không, nó không thể được sử dụng mà không kế thừa vì nó cần được khởi tạo trước tiên và do đó nó yêu cầu kế thừa. Nhưng Abstraction của chính nó không cần thừa kế.

  • Polymorphismkhông thể không thừa kế: Điều này là do đa hình giữa hai loại đối tượng phải có một điểm chung cho nó hoạt động. Điều này có thể đơn giản ngay cả bởi lớp Object trong trường hợp của java, từ đó tất cả các lớp được bắt nguồn.
+0

Điều đó phụ thuộc hoàn toàn vào ngôn ngữ. Ví dụ, trong Smalltalk, bạn có thể đạt được đa hình mà không thừa kế, vì Smalltalk là một ngôn ngữ ràng buộc muộn cho phép bạn đối xử với hai đối tượng giống như miễn là cả hai thực hiện cùng một phương thức (bao gồm cả chữ ký) –

+0

Điều cần biết. Vì vậy, không có câu trả lời đúng cho câu hỏi này cho đến khi một ngôn ngữ được chỉ định? – Rana

1

Câu trả lời cho cả ba câu hỏi là Có, có thể thực hiện chúng mà không thừa kế, nhưng câu trả lời thực là "Phụ thuộc vào ngôn ngữ mà chúng được triển khai".

Ý tôi là, hãy xem xét trình biên dịch C++ đầu tiên thực sự biên dịch mã của nó thành chuẩn C, không phải là ngôn ngữ OOP. Rõ ràng, mã phải được biên dịch sang một ngôn ngữ không hỗ trợ kế thừa.

0

Tôi có thể nói

Đóng gói - có. Ví dụ một hàm thao tác một biến tĩnh được khai báo bên trong nó (như trong C++). Hoặc mã c ẩn các biến và các hàm không xuất khẩu từ các đơn vị biên dịch khác.

Trừu tượng - có. "Khái niệm" trong c + + là một ví dụ về điều này.Trong C++ bạn có thể viết một thường trình và nói "mã này biên dịch miễn là loại đối số định nghĩa một toán tử nhỏ hơn".

Đa hình - có. Một con trỏ hàm đơn giản có thể được sử dụng để cung cấp một triển khai có thể cắm được.

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