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ẽ sẻ chia một vài nội dung liên quan đến Tính kế thừa chúng ta không nên bỏ qua.
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 thuộc tính còn lại bao gồm: Tính đóng gói (Encapsulation), Tính trừu tượng (Abstraction) & Tính đa hình (Polymorphism).
Tính kế thừa khá cần thiết trong OOP (Nguồn: Unsplash).
Kế thừa có thể được định nghĩa là hành trình mà một lớp (class) có được các tính chất của một lớp khác. Các tính chất đó 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à các mối quan hệ trong đời sống. Kiểu như “chó đốm” & “chó sói” đều là hai lớp con thuộc lớp cha là “chó”. Vì vậy, 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 thế như sau:
- Tính kế thừa làm tăng năng lực tái 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 xuất 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 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ã & 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 hạn chế đượ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 thế tốt nêu trên, Tính kế thừa có một số điểm không tốt sau:
- Các chức năng được kế thừa hoạt động chậm hơn chức năng thông 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 dùng. việc này có thể dẫn đến lãng phí bộ nhớ.
- Tính kế thừa giúp tăng sự kết nối giữa lớp cơ sở & 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, đấy là tùy thuộc vào mỗi ngôn ngữ mà Tính kế thừa sẽ không giống nhau. Khi 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 sẽ 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.
>>> Xem thêm: Lỗi Syntax trong lập trình và những điều bạn cần biết
Những loại kế thừa
1. Đơn kế thừa(Single Inheritance):
Đơn kế thừa: nghĩa là một lớp chỉ được kế thừa từ đúng một lớp khác. Hay nói theo một cách khác, lớp con chỉ có duy nhất một lớp cha.
Cú pháp khai báo đơn kế thừa:
classlopcon:phamvidulieulopcha// nội dung lớp con;
Dưới đây là một ví dụ:
#includeusingnamespace std;// Lớp chaclassMayvitinhpublic:Mayvitinh()
cout <<"This is a computer"<< endl;
;// Lớp con kế thừa từ lớp chaclassmayAcer:publicMayvitinh
;// main functionintmain()
mayAcer may1;return0;
Chương trình sẽ cho kết quả:
2. Đa kế thừa (Multiple Inheritance):
Đa kế thừa là một tính năng của ngôn ngữ C++. Trong đó một lớp có thể kế thừa từ nhiều hơn một lớp khác. Nghĩa là một lớp con được kế thừa từ nhiều hơn một lớp cơ sở.
Cú pháp khai báo đa kế thừa:
classlopcon:phamvitruycaplopcha1, phamvitruycaplopcha2, ....
// nội dung của lớp con;
Ở đây, các lớp cơ sở sẽ được phân tách bằng dấu phẩy ,
và phạm vi truy cập cho mọi lớp cơ sở phải được chỉ định.
Chúng ta cùng xem VD sau:
#includeusingnamespace std;// Lớp cơ sở thứ nhấtclassMayvitinhpublic:Mayvitinh()
cout <<"This is a computer's brand"<< endl;
;// Lớp cơ sở thứ 2classMaylaptoppublic:Maylaptop()
cout <<"This is a laptop's brand"<< endl;
;// Lớp con kế thừa từ 2 lớp chaclassmayAcer:publicMayvitinh, publicMaylaptop
;// main functionintmain()
mayAcer may1;return0;
Một khi chạy ta sẽ có kết quả sau:
3. Kế thừa đa cấp (Multilevel Inheritance):
Kế thừa đa cấp: Trong kiểu thừa kế này, một lớp dẫn xuất được tạo từ một lớp dẫn xuất khác.
Ví dụ về kế thừa đa cấp:
#includeusingnamespace std;// Lớp chaclassMayvitinhpublic:Mayvitinh()
cout <<"This is a computer's brand"<< endl;
;// Lớp con kế thừa từ lớp chaclassMaylaptop:publicMayvitinhpublic:Maylaptop()
cout <<"This is a laptop's brand"<< endl;
;// Lớp con kế thừa từ lớp cha thứ haiclassmayAcer:publicMaylaptoppublic:mayAcer()
cout <<"This brand is Acer"<< endl;
;// main functionintmain()
mayAcer may1;return0;
Sau khi chạy ta có kết quả:
>>> Xem thêm: 9 bí quyết học lập trình mobile cực nhanh của các lập trình viên
4. Kế thừa phân cấp (Hierarchical Inheritance):
Kế thừa phân cấp: Trong kiểu thừa kế này, sẽ có nhiều hơn một lớp con được kế thừa từ một lớp cha độc nhất.
Chúng ta có ví dụ:
#includeusingnamespace std;// Lớp chaclassMayvitinhpublic:Mayvitinh()
cout <<"This is a computer's brand"<< endl;
;// Lớp con thứ nhấtclassmayAsus:publicMayvitinh
;// Lớp con thứ 2classmayAcer:publicMayvitinh
;// main functionintmain()
mayAcer may1;
mayAsus may2;return0;
Một khi chạy ta có kết quả:
5. Kế thừa lai (Kế thừa ảo) – Hybrid (Virtual) Inheritance:
Kế thừa lai (Kế thừa ảo): được thực hiện thông qua việc kết hợp nhiều hơn một loại thừa kế.
Chúng ta lấy VD về sự kết hợp của phân cấp & đa kế thừa sau đây:
#includeusingnamespace std;// Lớp chaclassMayvitinhpublic:Mayvitinh()
cout <<"This is a computer's brand"<< endl;
;// Lớp chaclassMaylaptoppublic:Maylaptop()
cout <<"This is a laptop's brand"<< endl;
;// Lớp con thứ nhấtclassmayAcer:publicMayvitinh
;// Lớp con thứ 2classmayAsus:publicMayvitinh, publicMaylaptop
;// main functionintmain()
mayAsus may1;
mayAcer may2;return0;
Một khi chạy ta có kết quả:
Kết
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, hơn thế nữa với những lập trình viên mới vào nghề. Thế nên, trừ khi mà 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ó.
Nhật Minh – Tổng hợp và bổ sung
Nguồn: codelearn.io, vn.got-it.ai, howkteam.vn
Bình luận về chủ đề post