[Phần 3] OOP: Tìm hiểu về Kế Thừa và Đa Hình trong Lập Trình Hướng Đối Tượng
Hải Đăng
Tác giả tại CLB Lập Trình PTIT
Hôm nay, chúng ta tiếp tục khám phá những tính chất quan trọng trong Lập trình hướng đối tượng (OOP) - đó chính là "Kế thừa" và "Đa hình". Đây là những khái niệm giúp các lập trình viên quản lý và phát triển code một cách hiệu quả hơn. Cùng tìm hiểu chi tiết qua bài viết này nhé!
Tính Kế Thừa (Inheritance)
Tính kế thừa cho phép chúng ta xây dựng một lớp mới (class con) dựa trên các định nghĩa của một lớp đã tồn tại (class cha). Qua đó, lớp con sẽ thừa hưởng các thuộc tính (attributes) và phương thức (method) từ lớp cha, đồng thời có thể thêm các thuộc tính và phương thức riêng.
- Lớp cha: Người lao động (có các thuộc tính như tiền lương, giờ làm việc, nơi làm việc).
- Lớp con: Công nhân, Bác sĩ, Lập trình viên (mỗi lớp con đều có những đặc điểm chung từ lớp cha, nhưng thêm các đặc tính riêng).
Chỉ Định Truy Cập (Access Modifier)
Khi kế thừa, chỉ định truy cập (Access Modifier) đóng vai trò quan trọng. Nó quyết định phạm vi truy cập của các biến và phương thức.
- Nếu một thành phần ở lớp cha được khai báo là private, lớp con không thể kế thừa hoặc truy cập vào thành phần đó.
- Muốn hiểu rõ hơn về các kiểu kế thừa, các bạn có thể tham khảo bảng dưới đây:
Ưu Điểm Của Tính Kế Thừa
- Giảm khả năng sai sót: Khi thay đổi ở lớp cha, các lớp con sẽ tự động inherits các thay đổi đó.
- Tiết kiệm thời gian và tài nguyên: Code được tái sử dụng, giúp việc bảo trì và phát triển dự án trở nên dễ dàng hơn.
- Ví dụ mô phỏng tính kế thừa:
java1class Person { 2 protected String name; 3 int age; 4 5 public String getName() { 6 return name; 7 } 8 9 public void setName(String s) { 10 name = s; 11 } 12} 13 14class Manager extends Person { 15 private String department; 16} 17 18public class Main { 19 public static void main(String[] args) { 20 Manager manager = new Manager(); 21 manager.setName("Nguyen Van A"); 22 System.out.println(manager.getName()); 23 } 24}
- Ouput:
java1Nguyen Van A
Ghi Đè (Function Overriding)
Ghi đè là việc định nghĩa lại hàm trong lớp con với cùng tên hàm, số lượng và kiểu tham số như trong lớp cha.
Ví dụ:- Lớp cha DongVat có hàm keu().
- Lớp con Meo định nghĩa lại hàm keu() với nội dung riêng.
java1class Person { 2 public void print() { 3 System.out.println("Person"); 4 } 5} 6 7class Developer extends Person { 8 @Override 9 public void print() { 10 System.out.println("Developer"); 11 } 12} 13 14public class Main { 15 public static void main(String[] args) { 16 // Khi muốn gọi tới hàm ghi đè trong class con 17 Developer dev1 = new Developer(); 18 dev1.print(); 19 // Output : Developer 20 21 // Khi muốn gọi tới hàm ghi đè trong class cha 22 // Sử dụng ép kiểu để gọi phương thức của lớp cha 23 Developer dev2 = new Developer(); 24 ((Person) dev2).print(); 25 // Output : Person 26 } 27} 28
Tính Đa Hình (Polymorphism)
Tính đa hình là khả năng của các lớp con có cùng lớp cha nhưng thực hiện khác nhau khi gọi một phương thức.
Ví dụ:- Tạo một con trỏ thuộc lớp cha DongVat, nhưng trỏ đến đối tượng thuộc lớp con Meo.
- Khi gọi hàm keu(), chương trình sẽ biết gọi đến hàm của lớp con Meo thay vì lớp cha DongVat.
Ở ví dụ dưới đây ta tạo một con trỏ (pointer) thuộc class DongVat nhưng trỏ đến đối tượng thuộc class Meo. Khi ta muốn gọi đến hàm keu() của class Meo thì ta phải khai báo hàm keu() trong class DongVat là virtual function.
- Ví dụ mô phỏng tính đa hình:
java1class DongVat { 2 public void keu() { 3 System.out.println("Động vật kêu gì đó..."); 4 } 5} 6 7class Meo extends DongVat { 8 @Override 9 public void keu() { 10 System.out.println("Meo meo"); 11 } 12} 13 14public class Main { 15 public static void main(String[] args) { 16 // Sử dụng tính đa hình 17 DongVat dv1 = new Meo(); 18 dv1.keu(); 19 // Output: Meo meo 20 } 21} 22
👉 Cách khai báo virtual function rất đơn giản là ta chỉ cần thêm từ khóa virtual vào trước function trong class cha. Lúc này bất cứ lớp con nào kế thừa class cha đều phải overriding lại virtual function, nếu không chương trình sẽ bị lỗi.
Kết Luận
Tính "Kế thừa" và "Đa hình" là hai tính chất quan trọng trong OOP, giúp code trở nên linh hoạt và dễ bảo trì hơn. Hy vọng qua bài viết này, các bạn đã hiểu rõ hơn về cách thức hoạt động và ứng dụng của chúng trong thực tế.
Nếu có thắc mắc hoặc cần thêm thông tin, đừng ngần ngại để lại bình luận phía dưới nhé!
📺 Youtube: https://www.youtube.com/channel/UCdOcZv16XwUi7bhawqPjV9g
🌐 Website: https://proptit.com/
💻 Fanpage: https://www.facebook.com/clubproptit/
💌 Email: clblaptrinhptit@gmail.com
Lập trình hướng đối tượng
Serie tìm hiểu về Lập trình hướng đối tượng và Java
