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.
Mục lục
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).
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).
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:
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:
- 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.
- 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.
- 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.
- 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.
- 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.