JavaRush /Blog Java /Random-VI /Nghỉ giải lao #95. Cách giải quyết vấn đề đa kế thừa tron...

Nghỉ giải lao #95. Cách giải quyết vấn đề đa kế thừa trong Java

Xuất bản trong nhóm
Nguồn: FreeCodeCamp Java là một trong những ngôn ngữ lập trình hướng đối tượng được sử dụng phổ biến nhất hiện nay. Vì nó độc lập với nền tảng nên bạn có thể tìm thấy các ứng dụng Java trên mọi loại thiết bị và mọi hệ điều hành. Và vì Java tương đối dễ học nên nó là một trong những ngôn ngữ được nhiều lập trình viên thành thạo. Một tính năng quan trọng của Java mà bạn nên làm quen là tính kế thừa lớp. Tính kế thừa cho phép bạn tối ưu hóa mã của mình, giúp việc sử dụng lại các lớp dễ dàng hơn. Khi bạn có thể sử dụng lại mã đã được kiểm tra và sửa lỗi, vòng đời phát triển phần mềm sẽ trở nên ngắn hơn và ít tốn kém hơn. Nghỉ giải lao #95.  Cách giải quyết vấn đề đa kế thừa trong Java - 1Mặc dù về mặt lý thuyết là một khái niệm đơn giản nhưng việc mã hóa các mối quan hệ kế thừa đòi hỏi phải chú ý đến từng chi tiết. Đặc biệt đối với đa kế thừa, trong đó một lớp con kế thừa các thuộc tính từ nhiều lớp cha. Java từ chối nhiều mối quan hệ thừa kế vì chúng tạo ra sự mơ hồ, nhưng có một số cách để đạt được nhiều hiệu quả tương tự nếu bạn biết phải làm gì. Trong bài viết này, chúng ta sẽ xem xét các vấn đề với đa kế thừa và thảo luận về các tùy chọn mã hóa thay thế trong Java.

Thuật ngữ kế thừa

Đôi khi, để trở thành một lập trình viên thành công, bạn cần trở thành người giải quyết vấn đề để tìm ra cách giải quyết cho các lỗi hoặc sự cố thường gặp. Đây là một phần thiết yếu của mã hóa an toàn và thông minh. Một vấn đề như vậy liên quan đến đa kế thừa (hay nói đúng hơn là thiếu tính kế thừa) trong Java. Nghỉ giải lao #95.  Cách giải quyết vấn đề đa kế thừa trong Java - 2Để hiểu đầy đủ về tính kế thừa trong Java, bạn cần làm quen với thuật ngữ kế thừa cơ bản của lập trình hướng đối tượng (OOP).
  • Các lớp là cấu trúc mẫu cơ bản trong các ngôn ngữ lập trình hướng đối tượng. Một lớp xác định các thuộc tính chung cho một nhóm đối tượng.
  • Lớp cha : Còn được gọi là lớp cơ sở hoặc lớp siêu. Lớp cha là lớp có thể mở rộng, cung cấp chức năng cho lớp con. Nó cho phép tái sử dụng. Các định nghĩa và hàm của lớp cha được sử dụng lại khi tạo các lớp con.
  • Lớp con : Nói chung được gọi là lớp con, lớp con kế thừa chức năng từ lớp khác. Các lớp con là các lớp mở rộng hoặc dẫn xuất.
  • Kế thừa : Mối quan hệ giữa lớp cha và lớp con.

Các kiểu kế thừa OOP

Có rất nhiều ngôn ngữ lập trình hướng đối tượng phổ biến được sử dụng hiện nay, bao gồm Java, C++, JavaScript, Python, PHP, Ruby và Perl. Mặc dù kế thừa là một khái niệm phổ biến trong số các ngôn ngữ OOP này, nhưng không phải tất cả các kiểu kế thừa đều tồn tại trong mỗi ngôn ngữ này. Điều cực kỳ quan trọng là phải biết các kiểu kế thừa phổ biến và các hạn chế về kế thừa trong ngôn ngữ cụ thể mà bạn đang sử dụng. Bạn càng biết nhiều về kế thừa, bạn sẽ càng trở thành nhà phát triển hiệu quả hơn. Các kiểu kế thừa được Java hỗ trợ bao gồm:
  • Kế thừa một cấp : Khi một lớp con kế thừa các tính năng từ một lớp cha duy nhất.
  • Kế thừa đa cấp : Đây là hình thức kế thừa đa cấp một cấp. Trong kế thừa đa cấp, một lớp con cũng có thể đóng vai trò là lớp cha của các lớp con khác. Mối quan hệ giữa mỗi cấp độ là tuyến tính - không có nhánh nào cao hơn so với đa kế thừa. Trong trường hợp này, lớp con cuối cùng có chức năng từ tất cả các cấp độ trên.
  • Kế thừa phân cấp : Ngược lại với đa kế thừa. Trong kế thừa phân cấp, một lớp cha có nhiều hơn một lớp con. Vì vậy, thay vì có các nhánh phía trên, nó lại phân nhánh ở phía dưới.
  • Kế thừa lai : Đúng như tên gọi, kế thừa lai là sự kết hợp của các kiểu thừa kế khác.
Ngoài các kiểu kế thừa được liệt kê ở trên, còn có các kiểu khác mà Java không hỗ trợ.
  • Đa kế thừa : Trong đa kế thừa, một lớp con có nhiều hơn một lớp cha. Mặc dù Java và JavaScript không hỗ trợ đa kế thừa nhưng các ngôn ngữ OOP như C++ thì có.
  • Kế thừa đa đường dẫn : Là sự kết hợp của kế thừa đa cấp, đa cấp và phân cấp, trong kế thừa đa đường dẫn, một lớp con kế thừa các đặc điểm và chức năng của nó từ lớp cha và một số lớp con của lớp cha. Vì kế thừa đa đường dựa trên đa kế thừa nên Java không hỗ trợ việc sử dụng nó.

Tại sao Java không hỗ trợ đa kế thừa

Vấn đề chính với đa kế thừa là nó có thể tạo ra sự mơ hồ trong các lớp con. Trong sách trắng năm 1995, nhà thiết kế Java chính James Gosling đã tuyên bố rằng các vấn đề về đa kế thừa là một trong những lý do khiến Java được tạo ra. Sự phức tạp vốn có của đa kế thừa được thấy rõ nhất trong bài toán kim cương. Trong bài toán kim cương, lớp cha A có hai lớp con B và C riêng biệt; nghĩa là, các lớp con B và C mở rộng lớp A. Nghỉ giải lao #95.  Cách giải quyết vấn đề đa kế thừa trong Java - 3Bây giờ chúng ta tạo một lớp con D mới mở rộng cả lớp B và lớp C. Lưu ý rằng chúng ta có nhiều kế thừa (D mở rộng B và C), kế thừa phân cấp ( B và C mở rộng A) và kế thừa đa cấp (D mở rộng A, B và C). Trong bài toán kim cương, lớp con B và C kế thừa một phương thức từ lớp cha A. Cả B và C đều ghi đè phương thức được kế thừa. Nhưng các phương pháp mới ở B và C mâu thuẫn với nhau. Lớp con cuối cùng D kế thừa hai phương thức độc lập và xung đột từ nhiều cha mẹ B và C của nó. Không rõ nên sử dụng phương thức nào của lớp D, do đó nảy sinh sự mơ hồ. Các ngôn ngữ lập trình OOP khác triển khai các phương pháp khác nhau để giải quyết sự mơ hồ của đa kế thừa.

Cách giải quyết vấn đề đa kế thừa trong Java

Việc đa kế thừa có vấn đề không có nghĩa là nó vô dụng. Có nhiều tình huống mà bạn có thể muốn một lớp có chức năng từ một số lớp khác. Hãy nghĩ về chiếc Tesla Roadster mà bạn sẽ mua khi trở thành một nhà phát triển phần mềm cực kỳ thành công. Đặc tính kỹ thuật của nó dựa trên cả hạng xe thể thao và hạng xe điện. Một ví dụ khác: trình duyệt mà bạn đang đọc bài viết này. Nó có các tính năng từ lớp giải pháp bảo mật Internet và từ lớp trình duyệt Internet nói chung. Nhưng bạn không thể mở rộng nhiều lớp trong Java. Vậy ngôn ngữ này giải quyết vấn đề đa kế thừa như thế nào? Java sử dụng các cấu trúc được gọi là giao diện. Giao diện là các kiểu trừu tượng xác định hành vi sẽ được các lớp thực hiện. Bởi vì chúng trừu tượng nên các giao diện không chứa các hướng dẫn chi tiết về hành vi của chúng. Thay vào đó, các lớp cung cấp các triển khai cụ thể về hành vi giao diện. Giao diện có một số đặc điểm xác định:
  • Không giống như các lớp, bạn không khởi tạo giao diện. Thay vào đó, các lớp thực hiện các giao diện.
  • Các giao diện chỉ chứa các định nghĩa hằng số công khai và các tiêu đề phương thức.
  • Giao diện chỉ có thể mở rộng các giao diện khác, không phải các lớp.
  • Giao diện có thể mở rộng nhiều giao diện và các lớp có thể triển khai nhiều giao diện.
Bây giờ chúng ta có thể giải quyết vấn đề kim cương một cách hiệu quả bằng cách sử dụng các giao diện. Hãy nhớ rằng chỉ các giao diện mới có thể mở rộng các giao diện khác và bất kỳ lớp nào yêu cầu nhiều đặc điểm kế thừa đều phải triển khai nhiều giao diện, chúng ta có thể ghi đè các lớp có vấn đề kim cương. Những gì từng là lớp A, B và C giờ trở thành giao diện A, B và C. Giao diện B và C vẫn mở rộng giao diện A, nhưng không có giao diện nào trong số này có chức năng cụ thể, chỉ có các hành vi cụ thể. Lớp D vẫn là lớp chịu trách nhiệm triển khai cụ thể hành vi được tìm thấy trong giao diện B và C. Lưu ý một điểm khác biệt chính: lớp D không mở rộng giao diện B và C. Thay vào đó, nó triển khai chúng. Bằng cách này, bạn thực sự không có nhiều kế thừa. Thay vào đó, bạn chỉ cần trình bày lại vấn đề.

Phần kết luận

Hiểu tính kế thừa là điều cần thiết đối với bất kỳ nhà phát triển Java hiệu quả nào. Điều quan trọng không kém là phải biết những hạn chế của tính kế thừa và cách giải quyết có sẵn của Java đối với các vấn đề đa kế thừa truyền thống. Học cách tạo giao diện để tái tạo hiệu ứng của đa kế thừa trong Java sẽ cải thiện năng suất và cơ hội tuyển dụng của bạn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION