Lập trình C#

Nạp chồng toán tử trong C#

Nạp chồng toán tử trong C#
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

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ề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);
		}
	}
}

Kết quả chương trình

Kết quả chương trình

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »