Cách Mở Lại Tính Năng Chế Độ Chuyên Nghiệp Khi Bị Mất Trên Facebook
Lớp Trừu Tượng & Giao Diện: Hướng Dẫn Toàn Tập trong Lập Trình Hướng Đối Tượng (OOP)
Đa Hình trong Lập Trình Hướng Đối Tượng: Khái Niệm & Ví Dụ Chi Tiết
Kế thừa trong LTHDT c#
Xem người lạ là ai xem story của bạn trên facebook mới nhất 2025
Cách Xem Lịch Sử Video TikTok 2025: Hướng Dẫn Chi Tiết Nhất
Cách đăng xuất tài khoản Facebook từ xa trên mọi thiết bị (Điện thoại, Máy tính)
Cách đăng xuất tài khoản Google từ xa trên mọi thiết bị (Điện thoại, TV, Máy tính)
TOP Công Cụ AI Viết Nội Dung Hiệu Quả Giúp Tăng Năng Suất Làm Việc
Cách tìm lại SQL Server Configuration Manager khi không tìm thấy ở search windows
Đa Hình trong Lập Trình Hướng Đối Tượng: Khái Niệm & Ví Dụ Chi Tiết

Khám phá khái niệm, cách hoạt động của tính đa hình (Polymorphism) trong lập trình hướng đối tượng. Tìm hiểu liên kết tĩnh, liên kết động (virtual, override) qua ví dụ thực tế.
Bạn đã bao giờ nghe đến đa hình trong lập trình hướng đối tượng (OOP) chưa? Đây là một trong bốn trụ cột chính của OOP, cùng với tính đóng gói, kế thừa và trừu tượng. Đa hình (Polymorphism) mang lại sự linh hoạt và khả năng mở rộng mạnh mẽ cho code của bạn, giúp bạn viết chương trình hiệu quả và dễ bảo trì hơn.
Vậy, chính xác thì đa hình là gì và nó hoạt động như thế nào? Hãy cùng tìm hiểu!
1. Đa Hình Là Gì? Khái Niệm Đơn Giản Dễ Hiểu
Tính đa hình thể hiện khả năng các đối tượng khác nhau có thể phản ứng khác nhau với cùng một "thông điệp" (hay phương thức). Nói cách khác, bạn có thể gửi cùng một lệnh tới nhiều đối tượng, nhưng mỗi đối tượng sẽ thực hiện lệnh đó theo cách riêng của nó, dựa trên kiểu cụ thể của đối tượng đó.
Để dễ hình dung, hãy tưởng tượng bạn có một nút "In". Khi bạn nhấn nút này:
- Nếu bạn đang xem một Hình tròn, nó sẽ in ra hình tròn.
- Nếu bạn đang xem một Hình chữ nhật, nó sẽ in ra hình chữ nhật.
Cả "Hình tròn" và "Hình chữ nhật" đều là các dạng của "Hình". Chúng đều có khả năng "In", nhưng cách "In" của mỗi đối tượng lại khác nhau. Đây chính là bản chất của đa hình!
Trong lập trình, điều này có nghĩa là các lớp con (lớp dẫn xuất) có thể có các triển khai khác nhau cho cùng một phương thức được định nghĩa trong lớp cha (lớp cơ sở).
Ví dụ minh họa:
static void Main() a = new HinhChuNhat(); // Đối tượng 'a' giờ được gán lại thành HinhChuNhat |
Ở đây, biến a có kiểu là Hinh (lớp cơ sở), nhưng tùy thuộc vào việc nó được khởi tạo bằng HinhTron hay HinhChuNhat, phương thức In() sẽ được gọi từ lớp tương ứng.
2. Liên Kết Tĩnh (Static Binding)
Liên kết tĩnh là quá trình trình biên dịch xác định phương thức nào sẽ được gọi dựa trên kiểu khai báo của đối tượng. Nó còn được gọi là liên kết sớm (early binding).
Đặc điểm của liên kết tĩnh:
- Trình biên dịch xác định phương thức cần gọi tại thời điểm biên dịch.
- Nếu một đối tượng thuộc lớp cơ sở được khởi tạo từ một lớp dẫn xuất, nó chỉ có thể truy xuất đến các thành phần (thuộc tính, phương thức) được định nghĩa trong lớp cơ sở. Các thành phần riêng biệt của lớp dẫn xuất sẽ không thể truy cập được thông qua tham chiếu kiểu lớp cơ sở.
Ví dụ:
using System; class Program a.In(); // Gọi phương thức In() của lớp Diem. (Liên kết tĩnh) |
Trong ví dụ trên, mặc dù b được khởi tạo là Diem, nhưng vì kiểu khai báo của b là Hinh, trình biên dịch sẽ "buộc" nó gọi phương thức In() của lớp Hinh. Điều này giới hạn khả năng thể hiện đa hình.
3. Liên Kết Động (Dynamic Binding) - Nền Tảng Của Đa Hình
Liên kết động là cơ chế cho phép hệ thống xác định phương thức nào sẽ được gọi tại thời điểm chạy (runtime), dựa trên kiểu thực tế của đối tượng. Đây chính là cách mà tính đa hình được cài đặt trong các ngôn ngữ hướng đối tượng. Nó còn được gọi là liên kết muộn (late binding).
Để đạt được liên kết động trong C# (và nhiều ngôn ngữ OOP khác), chúng ta sử dụng các từ khóa đặc biệt:
- virtual: Đặt trước phương thức trong lớp cơ sở để khai báo rằng phương thức này có thể được ghi đè (override) trong các lớp con.
- override: Đặt trước phương thức trong lớp dẫn xuất để chỉ ra rằng phương thức này đang ghi đè một phương thức virtual (hoặc abstract) từ lớp cha.
Lưu ý quan trọng: Bạn chỉ có thể cài đặt tính đa hình động cho các phương thức và thuộc tính (properties) của lớp, không áp dụng được cho các trường (fields).
Ví dụ cài đặt đa hình động:
Hãy cùng xem cách triển khai đa hình với virtual và override:
// Lớp cơ sở public virtual void In() // Phương thức In() được đánh dấu là virtual // Lớp kế thừa HinhTron public override void In() // Phương thức In() ghi đè phương thức từ lớp Hinh // Lớp kế thừa HinhChuNhat public override void In() // Phương thức In() ghi đè phương thức từ lớp Hinh // Chương trình thực hiện Hinh b = new HinhChuNhat(); // 'b' là kiểu Hinh, nhưng khởi tạo là HinhChuNhat |
Với liên kết động, mặc dù biến a và b đều được khai báo kiểu Hinh, nhưng khi phương thức In() được gọi, hệ thống sẽ kiểm tra kiểu đối tượng thực tế mà a và b đang tham chiếu (HinhTron và HinhChuNhat). Do đó, phương thức In() tương ứng của lớp con sẽ được thực thi.
Tóm Lại
Đa hình là một công cụ mạnh mẽ trong lập trình hướng đối tượng, cho phép bạn viết mã linh hoạt, dễ bảo trì và mở rộng. Bằng cách sử dụng các từ khóa virtual và override để triển khai liên kết động, bạn có thể tạo ra các hệ thống mà ở đó các đối tượng khác nhau có thể phản ứng theo cách riêng của chúng với cùng một "thông điệp".
Hiểu và áp dụng thành thạo đa hình sẽ giúp bạn trở thành một lập trình viên giỏi hơn, tạo ra những phần mềm có khả năng thích ứng cao với sự thay đổi!
Bạn còn câu hỏi nào về tính đa hình hay các khái niệm OOP khác không?