Tính kế thừa trong OOP và các loại kế thừa bạn cần biết

Tính kế thừa trong OOP là một nội dung quan trọng mà lập trình viên nào cũng phải biết. Bài viết sẽ chia sẻ một số nội dung liên quan đến Tính kế thừa bạn không nên bỏ qua.

Kế thừa là một tính chất quan trọng trong OOP

Tổng quan về Tính kế thừa trong OOP

Khái niệm

Tính kế thừa (Inheritance) là một trong bốn tính chất cơ bản của Lập trình hướng đối tượng (Object-oriented programming – viết tắt là OOP). Các tính chất còn lại bao gồm: Tính đóng gói (Encapsulation), Tính trừu tượng (Abstraction) và Tính đa hình (Polymorphism).

Tính kế thừa khá quan trọng trong OOP (Nguồn: Unsplash).
Tính kế thừa khá quan trọng trong OOP (Nguồn: Unsplash).

Kế thừa có thể được định nghĩa là quá trình mà một lớp (class) có được các thuộc tính của một lớp khác. Các thuộc tính đó có thể là một phương thức (method) hoặc một trường (field) nào đó. Lớp được kế thừa sẽ được gọi chung là lớp cha, còn lớp kế thừa sẽ được gọi chung là lớp con.

Ý tưởng nảy sinh của Tính kế thừa chính là những mối quan hệ trong đời sống. Chẳng hạn như “chó đốm” và “chó sói” đều là hai lớp con thuộc lớp cha là “chó”. Do đó, cả hai lớp con này đều thừa hưởng được những đặc điểm của lớp cha.

Ưu điểm của Tính kế thừa

Nhìn chung, Tính kế thừa có một số ưu điểm như sau:

  • Tính kế thừa giúp tăng khả năng tái sử dụng. Khi một lớp kế thừa hoặc dẫn xuất một lớp khác, thì nó có thể truy cập tất cả các chức năng của lớp mà nó kế thừa.
  • Khả năng tái sử dụng nâng cao độ tin cậy. Chúng ta chỉ cần kiểm tra và gỡ lỗi với mã lớp cha, chứ không cần kiểm tra từng lớp con.
  • Khi mã được tái sử dụng, sẽ giúp giảm chi phí phát triển và bảo trì.
  • Các lớp con sẽ tuân thủ theo một giao diện (interface) chuẩn.
  • Tính kế thừa giúp hạn chế sự dư thừa mã và hỗ trợ khả năng mở rộng mã.
  • Lập trình viên có điều kiện thuận lợi để tạo các thư viện lớp (class libraries).
Tính kế thừa trong OOP giúp ta tránh được những đoạn mã dài dòng (Nguồn: Unsplash).
Tính kế thừa trong OOP giúp ta tránh được những đoạn mã dài dòng (Nguồn: Unsplash).

Nhược điểm của Tính kế thừa

Bên cạnh những ưu điểm nêu trên, Tính kế thừa có một số nhược điểm sau:

  • Các chức năng được kế thừa hoạt động chậm hơn chức năng bình thường, vì nó được thực hiện gián tiếp (lấy từ lớp cha) chứ không phải trực tiếp.
  • Thông thường, các dữ liệu thành viên trong lớp cha không được sử dụng. Điều này có thể dẫn đến lãng phí bộ nhớ.
  • Tính kế thừa làm tăng sự kết nối giữa lớp cơ sở và lớp kế thừa. Một thay đổi trong lớp cha sẽ ảnh hưởng đến tất cả các lớp con.
  • Nếu sử dụng Tính kế thừa không đúng cách có thể dẫn đến các cách giải quyết sai lầm sau này.

Chú ý về Tính kế thừa

Một điểm lưu ý cuối cùng, đó là tùy vào mỗi ngôn ngữ mà Tính kế thừa sẽ khác nhau. Khi sử dụng một ngôn ngữ, bạn cần nghiên cứu thật kỹ về Tính kế thừa của ngôn ngữ đó.

Chẳng hạn, phần lớn các ngôn ngữ như Java, JavaScript,… không hỗ trợ Đa kế thừa. Trong trường hợp này bạn có thể gặp phải một vấn đề thường được gọi là Diamond Problem (Vấn đề kim cương). Bởi nếu không có Đa thừa kế, thì không thể có Thừa kế lai.

Minh họa về Tính kế thừa trong OOP

Sau đây là một ví dụ về Tính kế thừa trong OOP được viết theo ngôn ngữ lập trình Python:

Ví dụ về Tính kế thừa trong OOP của ngôn ngữ lập trình Python.
Ví dụ về Tính kế thừa trong OOP của ngôn ngữ lập trình Python.

Chúng ta biết rằng, đa giác là một hình khép kín có 3 cạnh trở lên. Dựa vào định nghĩa này, chúng ta sẽ dùng mã Python để tạo ra một lớp “Polygon” (Đa giác). Lớp này được định nghĩa với 2 thuộc tính: số cạnh (n) và độ lớn mỗi cạnh. Phương thức “inputSides()” sẽ nhận độ lớn của mỗi cạnh và “dispSides()” sẽ hiển thị độ dài các cạnh này.

Tương tự, hình tam giác là hình đa giác có 3 cạnh. Vì vậy, chúng ta có thể tạo một lớp có tên là “Triangle” kế thừa từ “Polygon”. Điều này làm cho tất cả các thuộc tính của lớp Polygon có sẵn cho lớp Triangle.

Các loại kế thừa trong OOP

Trong OOP, có một số loại kế thừa như sau:

  1. Single Inheritance (Đơn kế thừa): đây là trường hợp một lớp chỉ được kế thừa từ một lớp duy nhất, tức là một lớp con chỉ có một lớp cha.
  2. Multiple Inheritance (Đa kế thừa): đây là trường hợp một lớp có thể kế thừa từ nhiều hơn một lớp khác, đồng nghĩa với việc một lớp con có thể có nhiều hơn một lớp cha.
  3. Multi-Level Inheritance (Kế thừa đa cấp): trong trường hợp này sẽ có một lớp kế thừa được tạo ra từ một lớp kế thừa khác.
  4. Hierarchical Inheritance (Kế thừa phân cấp): đây là trường hợp sẽ có nhiều lớp con được kế thừa từ một lớp cha duy nhất.
  5. Hybrid Inheritance (Kế thừa lai): hay còn được gọi là Kế thừa ảo (Virtual Inheritance). Đây là trường hợp kế thừa được kết hợp bởi nhiều hơn một loại kế thừa, chẳng hạn như kết hợp Đơn kế thừa với Đa kế thừa.

Trong các tính chất của OOP thì kế thừa là tính năng dễ bị sử dụng sai nhất, đặc biệt với những lập trình viên mới vào nghề. Do đó, trừ khi bạn có nhu cầu và nắm vững về tính kế thừa trong OOP, tuyệt đối đừng nên sử dụng nó.

Tham khảo: Programiz.com.

Nếu bạn quan tâm, hãy xem các vị trí đang tuyển dụng của Got It tại: bit.ly/gotit-hanoi và đọc thêm về quy trình tuyển dụng tại đây.

Son Phuoc
Son Phuoc
January 28, 2021
0
Share this post to:
Tags:
0 Comments
Inline Feedbacks
View all comments
Các bài viết liên quan
4 khóa học lập trình hướng đối tượng miễn phí cho người mới

4 khóa học lập trình hướng đối tượng miễn phí cho người mới

Nếu bạn muốn theo nghề IT thì sớm muộn cũng phải học lập trình hướng đối tượng. Đây là một kiến thức cơ bản, bắt buộc phải biết. Bài viết sẽ chia sẻ với bạn 4 khóa học miễn phí, phù hợp với người mới bắt đầu. Mục lục1. Học lập trình hướng đối tượng […]
Phương pháp lập trình hướng đối tượng và các ưu, nhược điểm

Phương pháp lập trình hướng đối tượng và các ưu, nhược điểm

Từ lâu phương pháp lập trình hướng đối tượng đã không còn xa lạ với các lập trình viên. Bài viết sẽ chia sẻ với các bạn một số ưu điểm và nhược điểm của phương pháp này. Mục lục1. Phương pháp lập trình hướng đối tượng là gì?2. Ưu điểm của phương pháp lập […]
4 khái niệm bạn phải biết khi lập trình hướng đối tượng

4 khái niệm bạn phải biết khi lập trình hướng đối tượng

Lập trình hướng đối tượng (Object-oriented programming) là một phương pháp quen thuộc đối với các chuyên gia phát triển phần mềm. Sau đây là 4 khái niệm bạn bắt buộc phải biết để hiểu về lập trình hướng đối tượng. Mục lục1. Class (Lớp)2. Objects (Đối tượng)3. Attributes (Thuộc tính)4. Methods (Phương thức) 1. […]
Bài tập lập trình hướng đối tượng cơ bản, nâng cao

Bài tập lập trình hướng đối tượng cơ bản, nâng cao

Đọc về Object-Oriented Programming (OOP) thôi là chưa đủ, quan trọng là bạn phải thực hành. Làm các bài tập lập trình hướng đối tượng sẽ giúp bạn nắm chắc hơn về OOP. Dưới đây là một số bài tập OOP Got It đã tổng hợp được. Hãy cùng làm để thành thạo lập trình […]
Inversion of control là gì? Tìm hiểu Dependency Inversion

Inversion of control là gì? Tìm hiểu Dependency Inversion

Các khái niệm như Dependency Injection, Dependency Inversion hay Inversion of Control là gì đều là những câu hỏi khó kể cả với những kỹ sư kỳ cựu. Nhiều bạn dù đã đi làm vài năm nhưng vẫn chưa thực sự hiểu rõ về các khái niệm này mà chỉ biết sử dụng chúng trong […]
7 câu hỏi thường gặp tring phỏng ván lập trình hướng đối tượng

7 câu hỏi thường gặp tring phỏng ván lập trình hướng đối tượng

Với nền kinh tế hiện đại ngày nay, lập trình viên đang là một nghề được nhiều doanh nghiệp săn đón. Bộ câu hỏi phỏng vấn lập trình hướng đối tượng được chia sẻ sau đây sẽ hỗ trợ bạn nắm bắt cơ hội nghề nghiệp. Cùng tìm hiểu nhé. Mục lụcLập trình hướng đối […]