Operator Overloading là nạp chồng toán tử – Cho phép các lớp do người dùng định nghĩa (user-defined) có thể có các chức năng như các kiểu dữ liệu có sẵn do ngôn ngữ lập trình đã định nghĩa.
– Mục đích: để viết mã chương trình gọn gàng, dễ hiểu hơn thay vì phải gọi phương thức, chúng ta có thể gọi thông qua toán tử bằng các phép tính thông thường.
– Ví dụ: khi ta muốn tính tổng 2 phân số chỉ cần gọi: “ps1 + ps2“, hay muốn tính hiệu của 2 đoạn thẳng thì chỉ cần gọi “line1 – line2“,…
– Một số đặc điểm của nạp chồng toán tử:
- Các toán tử được nạp chồng là các hàm có tên đặc biệt: dùng từ khóa “operator” đi theo sau đó là toán tử nạp chồng muốn định nghĩa.
- operator+:nạp chồng toán tử dấu cộng ( + )
- operator<:nạp chồng toán tử dấu nhỏ hơn ( < )
- operator!=:nạp chồng toán tử so sánh khác ( != )
- Cũng giống như bất kỳ một method nào khác, một toán tử được nạp chồng cũng có: kiểu trả về và danh sách các tham số.
- Toán tử nạp chồng thì bắt buộc phải khai báo public static.
– Bảng liệt kê các toán tử có thể và không thể nạp chồng trong C#:
Toán tử | Miêu tả |
+, -, !, ~, ++, — | Những toán tử một ngôi này nhận một toán hạng và có thể được nạp chồng |
+, -, *, /, % | Những toán tử nhị phân này nhận một toán hạng và có thể được nạp chồng |
=, !=, <, >, <=, >= | Các toán tử so sánh có thể được nạp chồng |
&&, || | Các toán tử logic điều kiện không thể được nạp chồng một cách trực tiếp |
+=, -=, *=, /=, %= | Các toán tử gán không thể được nạp chồng |
=, ., ?:, ->, new, is, sizeof, typeof | Các toán tử này không thể được nạp chồng |
– Để dễ hiểu, sau đây mình minh họa nạp chồng toán tử dấu cộng cho lớp phân số:
using System; namespace MinhHoangBlog { class NapChongToanTu { static void Main(string[] args) { // Trường hợp cùng mẫu số PhanSo ps1 = new PhanSo(4, 9); PhanSo ps2 = new PhanSo(11, 9); PhanSo ps3 = ps1 + ps2; ps3.InPhanSo(); // Trường hợp khác mẫu số PhanSo ps4 = new PhanSo(2, 3); PhanSo ps5 = new PhanSo(7, 5); PhanSo ps6 = ps4 + ps5; ps6.InPhanSo(); Console.ReadKey(); } } class PhanSo { private int m_tuso; private int m_mauso; // Constructor public PhanSo(int tuso, int mauso) { m_tuso = tuso; m_mauso = mauso; } // Nạp chồng toán tử phép cộng + public static PhanSo operator +(PhanSo ps1, PhanSo ps2) { int ts = 0; int ms = 0; // Trường hợp cùng mẫu số if (ps1.m_mauso == ps2.m_mauso) { ts = ps1.m_tuso + ps2.m_tuso; ms = ps1.m_mauso; //Tối giản phân số ToiGianPhanSo(ref ts, ref ms); } // Trường hợp khác mẫu số else { ts = (ps1.m_tuso * ps2.m_mauso) + (ps2.m_tuso * ps1.m_mauso); ms = ps1.m_mauso * ps2.m_mauso; // Tối giản phân số ToiGianPhanSo(ref ts, ref ms); } return new PhanSo(ts, ms); } // Tối giản phân số private static void ToiGianPhanSo(ref int ts, ref int ms) { int i, j, uscln = 1; j = (ts > ms) ? ts : ms; for (i = 1; i <= j; i++) { if (ts % i == 0 && ms % i == 0) { uscln = i; } } ts = ts / uscln; ms = ms / uscln; } // In phân số public void InPhanSo() { Console.WriteLine(m_tuso + "/" + m_mauso); } } }