Đa hình (Polymorphism) trong C# là khả năng xử lý nhiều lớp có cùng tên và liên kết với nhau. Đây là một khái niệm quan trọng trong lập trình hướng đối tượng, ngay sau tính đóng gói (encapsulation) và tính kế thừa (inheritance). Để tìm hiểu chi tiết về đa hình (Polymorphism) trong C#, đọc tiếp bài viết dưới đây từ Mytour.
Đa hình (Polymorphism) trong C#
1. Tính đa hình (Polymorphism) trong C#.
2. Các dạng đa hình trong C#.
3. Đa hình tĩnh trong C# (hay Compile Time).
4. Đa hình động trong C# (hay Runtime Polymorphism).
5. Ngăn lớp dẫn xuất ghi đè các thành viên ảo.
6. Truy cập thành viên ảo lớp cơ sở.
7. Tổng kết.
1. Tính đa hình (Polymorphism) trong C#
Đa hình (Polymorphism) là thuật ngữ xuất phát từ tiếng Hy Lạp, dịch sang tiếng Việt có nghĩa là 'một tên nhiều hình thức, hình dạng khác nhau'.
Nói một cách khác, một đối tượng có thể có nhiều hình thức hoặc một tên có nhiều chức năng khác nhau. 'Poly' nghĩa là nhiều và 'morph' nghĩa là các hình thức. Đa hình cung cấp khả năng thực thi nhiều lớp có cùng tên.
Đa hình trong C# giải quyết việc xử lý nhiều lớp có cùng tên và liên kết với nhau. Đây là một khái niệm quan trọng trong lập trình hướng đối tượng, ngay sau khi chúng ta đã tìm hiểu về tính đóng gói và kế thừa.
2. Các dạng đa hình trong C#
Về cơ bản, C# có 2 loại đa hình chính:
- Đa hình tĩnh / Thời gian biên dịch.
- Đa hình động / Thời gian chạy.
3. Đa hình tĩnh trong C# (hay Compile Time)
Đa hình tĩnh (hoặc Compile Time) trong C# còn được biết đến là Early Binding. Phương thức nạp chồng (overloading) là một ví dụ điển hình về đa hình tĩnh.
Trong nạp chồng, các phương thức / hàm có cùng tên nhưng khác chữ ký. Nó còn được biết đến là đa hình ở thời điểm biên dịch (Compile Time Polymorphism) vì quyết định về phương thức được gọi được thực hiện khi biên dịch. Nạp chồng (overloading) là khái niệm trong đó các phương thức có tên giống nhau nhưng khác bộ tham số.
Ở đây, trình biên dịch kiểm tra số lượng và loại tham số được truyền, sau đó quyết định phương thức nào sẽ được gọi. Trong trường hợp không tìm thấy phương thức phù hợp, trình biên dịch sẽ báo lỗi.
- Ví dụ về đa hình tĩnh trong C#:
Trong ví dụ này, lớp chứa 2 phương thức cùng tên Add, nhưng khác bộ tham số (phương thức đầu tiên có 3 tham số và phương thức thứ 2 có 2 tham số).
4. Đa hình động trong C# (hoặc Runtime Polymorphism)
Đa hình động, hay Runtime Polymorphism còn được biết đến là Late Binding. Trong đó tên phương thức và chữ ký phương thức (số lượng tham số và loại tham số phải giống nhau, nhưng có thể có cách triển khai khác nhau). Phương thức ghi đè (overriding) là một ví dụ điển hình về đa hình động.
Phương thức ghi đè (overriding) có thể thực hiện bằng cách sử dụng tính kế thừa. Với phương thức ghi đè, lớp cơ sở và lớp dẫn xuất có thể có cùng tên phương thức và một số thứ khác. Trình biên dịch không nhận thức được phương thức có sẵn để ghi đè hàm, vì vậy nó sẽ không trả về lỗi khi biên dịch. Trình biên dịch sẽ quyết định gọi phương thức nào trong thời gian chạy và nếu không tìm thấy phương thức nào thì nó sẽ báo lỗi.
Trình biên dịch yêu cầu phương thức Area () và biên dịch thành công, nhưng phiên bản phương thức Area () không được xác định tại thời điểm biên dịch mà được xác định khi chạy. Cuối cùng, các phương thức ghi đè phải có cùng tên và chữ ký (số lượng tham số và loại), vì phương thức ảo hoặc trừu tượng được định nghĩa trong phương thức lớp cơ sở và nó được ghi đè trong lớp dẫn xuất.
Một phương thức hoặc hàm của lớp cơ sở có sẵn cho lớp con (lớp dẫn xuất) mà không sử dụng từ khóa 'overriding'. Trình biên dịch ẩn các hàm hoặc phương thức của lớp cơ sở. Khái niệm này còn được gọi là shadowing hoặc phương thức ẩn (method hiding)
5. Ngăn lớp dẫn xuất ghi đè các thành viên ảo
Các thành viên ảo (virtual member) không phụ thuộc vào số lớp giữa chúng và lớp được khai báo ban đầu.
Ví dụ, nếu lớp X chứa phương thức ảo 'A' và lớp Y là lớp dẫn xuất từ X, và X là lớp dẫn xuất từ Y, lớp Z kế thừa phương thức ảo 'A' và thực hiện việc ghi đè lên nó.
Một lớp dẫn xuất có thể chấm dứt quá trình kế thừa ảo bằng cách khai báo một thành viên ghi đè là 'sealed'.
6. Truy cập thành viên ảo lớp cơ sở
Sử dụng từ khóa 'base', lớp dẫn xuất có thể truy cập phương thức của lớp cơ sở.
7. Tổng kết
- Đa hình có ý nghĩa là một tên có nhiều hình thức, hình dạng khác nhau.
- Có 2 dạng đa hình:
+ Đa hình tĩnh hoặc compile time (ví dụ, phương thức nạp chồng và toán tử nạp chồng).
+ Đa hình động hoặc runtime polymorphism (ví dụ như ghi đè).
- Phương thức ghi đè khác shadowing.
- Sử dụng từ khóa 'new' để ẩn thành viên lớp cơ sở.
- Ngăn chặn lớp dẫn xuất ghi đè các thành viên ảo.
- Có thể truy cập một thành viên ảo của lớp cơ sở từ lớp dẫn xuất.
Bài viết trên đây Mytour vừa giới thiệu về tính đa hình (Polymorphism) trong C#. Nếu có thắc mắc hoặc câu hỏi, bạn có thể để lại ý kiến trong phần bình luận dưới bài viết. Ngoài ra, độc giả có thể tham khảo thêm các bài viết khác trên Mytour để hiểu rõ hơn về tính đóng gói trong C#.