Tính đa hình (Polymorphism) trong C# xử lý nhiều lớp có cùng tên, có liên hệ với nhau. Đây cũng là một trong những khái niệm quan trọng trong lập trình hướng đối tượng sau khái niệm tính đóng gói (encapsulation) và tính kế thừa (inheritance). Để tìm hiểu chi tiết về tính đa hình (Polymorphism) trong C#, bạn đọc cùng tham khảo tiếp bài viết dưới đây của Taimienphi.vn.
Tính đa hình (Polymorphism) trong C#
1. Tính đa hình (Polymorphism) trong C#
Polymorphism (tính đa hình) là từ có nguồn gốc từ Hy Lạp, dịch sang nghĩa tiếng Việt nghĩa là "một tên nhiều hình thức, hình dạng khác nhau".
Nói cách khác, một đối tượng có nhiều hình thức hoặc một tên với nhiều chức năng khác nhau. "Poly" có nghĩa là nhiều và "morph" có 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.
Như đã đề cập ở trên, đa hình trong C# xử lý nhiều lớp có cùng tên, có liên hệ với nhau. Đây là một khái niệm quan trọng trong lập trình hướng đối tượng sau khái niệm tính đóng gói và kế thừa.
2. Các loại đa hình trong C#
Về cơ bản có 2 loại đa hình trong C#, bao gồm:
- Đa hình tĩnh / Compile Time.
- Đa hình động / Runtime.
3. Đa hình tĩnh trong C# (hay Compile Time)
Đa hình tĩnh (hay Compile Time) trong C# còn được gọi là Early Binding. Phương thức nạp chồng (overloading) là ví dụ điển hình về đa hình tĩnh.
Trong nạp chồng, phương thức / hàm có cùng tên nhưng khác chữ ký. Nó còn được gọi là đa hình ở thời điểm biên dịch (Compile Time Polymorphism) vì quyết định phương thức nào được gọi được thực hiện tại thời điểm biên dịch. Nạp chồng (overloading) là khái niệm trong đó các phương thức có cùng tên giống nhau như khác bộ tham số.
Ở đây trình biên dịch kiểm tra số lượng tham số được truyền và loại tham số, sau đó đưa ra quyết định gọi phương thức nào. Trong trường hợp nếu không tìm thấy phương thức nào, nó sẽ báo lại lỗi.
- Ví dụ về đa hình tĩnh trong C#:
Trong ví dụ dưới đây, lớp bao gồm 2 phương thức có cùng tên Add, nhưng khác tham số đầu vào khác nhau (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# (hay Runtime Polymorphism)
Đa hình động hay Runtime Polymorphism còn được gọi 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 có bao nhiêu lớp giữa các thành viên ảo và lớp được khai báo ban đầu.
Ví dụ, nếu lớp X có 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à ghi đè lên nó.
Một lớp dẫn xuất có thể dừng 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.
7. Tổng kết
- Đa hình nghĩa là một tên có nhiều hình thức, hình dạng khác nhau.
- Có 2 loại đa hình khác nhau:
+ Đ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ở.
- Chúng ta có thể ngă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 lớp cơ sở từ lớp dẫn xuất.
Bài viết trên đây Taimienphi.vn vừa giới thiệu cho bạn về tính đa hình (Polymorphism) trong C#. Nếu có bất kỳ thắc mắc hoặc câu hỏi nào cần giải đáp, bạn có thể để lại ý kiến của mình trong phần bình luận bên dưới bài viết nhé. Ngoài ra, bạn đọc có thể tham khảo thêm một số bài viết khác đã có trên Taimienphi.vn để tìm hiểu rõ hơn về tính đóng gói trong C# nhé.