uocmo_kchodoi

Moderator
NẠP CHỒNG TOÁN TỬ TRONG C#
Khái niệm: Operator Overloading là nạp chồng toán tử - cho phép các lớp người dùng định nghĩa có thể có các chức năng như kiểu có sẵn do ngôn ngữ lập trình đã định nghĩa trước đó.

Nạp chồng toán tử là thay việc gán được sử dụng trực tiếp các toán tử bình thường như: >=, <=, ==, +, -.....giờ phải dùng hàm Operator để gọi đến các toán tử này.

Ví dụ, bạn xét hàm sau:

public static Box operator+ (Box b, Box c)
{
Box box = new Box();
box.chieu_dai = b.chieu_dai + c.chieu_dai;
box.chieu_rong = b.chieu_rong + c.chieu_rong;
box.chieu_cao = b.chieu_cao + c.chieu_cao;
return box;
}

Hàm trên triển khai toán tử cộng (+) cho một lớp Box tự định nghĩa (user-defined). Nó cộng các thuộc tính của hai đối tượng Box và trả về đối tượng kết quả Box.

1. Triển khai Nạp chồng toán tử trong C#

Ví dụ dưới đây minh họa cách triển khai nạp chồng toán tử trong C#: tạo hai lớp có tên lần lượt là Box, TestCsharp như sau:

Lớp Box: chứa các thuộc tính và phương thức

using System;
namespace VietJackCsharp
{
class Box
{
private double chieu_dai;
private double chieu_rong;
private double chieu_cao;

public double tinhTheTich()
{
return chieu_dai * chieu_rong * chieu_cao;
}

public void setChieuDai(double len)
{
chieu_dai = len;
}

public void setChieuRong(double bre)
{
chieu_rong = bre;
}

public void setChieuCao(double hei)
{
chieu_cao = hei;
}

// nap chong toan tu + de cong hai doi tuong Box.
public static Box operator +(Box b, Box c)
{
Box box = new Box();
box.chieu_dai = b.chieu_dai + c.chieu_dai;
box.chieu_rong = b.chieu_rong + c.chieu_rong;
box.chieu_cao = b.chieu_cao + c.chieu_cao;
return box;
}
}
}

Lớp TestCsharp: chứa phương thức main() để thao tác trên đối tượng Box

using System;
namespace VietJackCsharp
{
public class TestCsharp
{
static void Main(string[] args)
{
Console.WriteLine("Nap chong toan tu trong C#");
Console.WriteLine("Vi du minh hoa nap chong toan tu");
Console.WriteLine("--------------------------");
//tao cac doi tuong Box1, Box2 va Box3
Box Box1 = new Box();
Box Box2 = new Box();
Box Box3 = new Box();
double the_tich = 0.0;

// nhap thong tin Box1
Box1.setChieuDai(6.0);
Box1.setChieuRong(7.0);
Box1.setChieuCao(5.0);

// nhap thong tin Box2
Box2.setChieuDai(12.0);
Box2.setChieuRong(13.0);
Box2.setChieuCao(10.0);

// tinh va hien thi the tich Box1
the_tich = Box1.tinhTheTich();
Console.WriteLine("The tich cua Box1 la: {0}", the_tich);

// tinh va hien thi the tich Box2
the_tich = Box2.tinhTheTich();
Console.WriteLine("The tich cua Box2 la: {0}", the_tich);

// con hai doi tuong
Box3 = Box1 + Box2;

// tinh va hien thi the tich Box3
the_tich = Box3.tinhTheTich();
Console.WriteLine("The tich cua Box3 la: {0}", the_tich);

Console.ReadKey();
}
}
}


Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

nap-chong-toan-tu.PNG

2. Toán tử có thể nạp chồng và không thể nạp chồng trong C#

Các toán tử có thể nạp chồng trong C#:

1. +, -, !, ~, ++, --
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
2. +, -, *, /, %
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
3. =, !=, <, >, <=, >=
Các toán tử so sánh có thể được nạp chồng
4. &&, ||
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
5. +=, -=, *=, /=, %=
Các toán tử gán không thể được nạp chồng
6. =, ., ?:, ->, new, is, sizeof, typeof
Các toán tử này không thể được nạp chồng

Ví dụ

Từ các khái niệm trên, chúng ta kế thừa ví dụ trên và nạp chồng thêm một số toán tử trong C#: ở trên chúng ta đã tạo hai lớp Box, TestCsharp, bây giờ chúng ta sửa lại code của mỗi lớp như sau:

Lớp Box: chứa các thuộc tính và phương thức

using System;
namespace VietJackCsharp
{
class Box
{
private double chieu_dai;
private double chieu_rong;
private double chieu_cao;

public double tinhTheTich()
{
return chieu_dai * chieu_rong * chieu_cao;
}

public void setChieuDai(double len)
{
chieu_dai = len;
}

public void setChieuRong(double bre)
{
chieu_rong = bre;
}


public void setChieuCao(double hei)
{
chieu_cao = hei;
}

// nap chong toan tu +
public static Box operator +(Box b, Box c)
{
Box box = new Box();
box.chieu_dai = b.chieu_dai + c.chieu_dai;
box.chieu_rong = b.chieu_rong + c.chieu_rong;
box.chieu_cao = b.chieu_cao + c.chieu_cao;
return box;
}
//nap chong toan tu ==
public static bool operator ==(Box lhs, Box rhs)
{
bool status = false;
if (lhs.chieu_dai == rhs.chieu_dai && lhs.chieu_cao == rhs.chieu_cao && lhs.chieu_rong == rhs.chieu_rong)
{
status = true;
}
return status;
}
//nap chong toan tu !=
public static bool operator !=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.chieu_dai != rhs.chieu_dai || lhs.chieu_cao != rhs.chieu_cao || lhs.chieu_rong != rhs.chieu_rong)
{
status = true;
}
return status;
}
//nap chong toan tu <
public static bool operator <(Box lhs, Box rhs)
{
bool status = false;
if (lhs.chieu_dai < rhs.chieu_dai && lhs.chieu_cao < rhs.chieu_cao && lhs.chieu_rong < rhs.chieu_rong)
{
status = true;
}
return status;
}
//nap chong toan tu >
public static bool operator >(Box lhs, Box rhs)
{
bool status = false;
if (lhs.chieu_dai > rhs.chieu_dai && lhs.chieu_cao > rhs.chieu_cao && lhs.chieu_rong > rhs.chieu_rong)
{
status = true;
}
return status;
}
//nap chong toan tu <=
public static bool operator <=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.chieu_dai <= rhs.chieu_dai && lhs.chieu_cao <= rhs.chieu_cao && lhs.chieu_rong <= rhs.chieu_rong)
{
status = true;
}
return status;
}
//nap chong toan tu >=
public static bool operator >=(Box lhs, Box rhs)
{
bool status = false;
if (lhs.chieu_dai >= rhs.chieu_dai && lhs.chieu_cao >= rhs.chieu_cao && lhs.chieu_rong >= rhs.chieu_rong)
{
status = true;
}
return status;
}
//nap chong phuong thuc ToString()
public override string ToString()
{
return String.Format("({0}, {1}, {2})", chieu_dai, chieu_rong, chieu_cao);
}
}
}

Lớp TestCsharp: chứa phương thức main() để thao tác trên đối tượng Box

using System;
namespace VietJackCsharp
{
public class TestCsharp
{
static void Main(string[] args)
{
Console.WriteLine("Nap chong toan tu trong C#");
Console.WriteLine("Vi du minh hoa nap chong toan tu");
Console.WriteLine("--------------------------");
//tao cac doi tuong Box1, Box2, Box2, Box4
Box Box1 = new Box();
Box Box2 = new Box();
Box Box3 = new Box();
Box Box4 = new Box();
double the_tich = 0.0;

// nhap thong tin Box1
Box1.setChieuDai(6.0);
Box1.setChieuRong(7.0);
Box1.setChieuCao(5.0);

// nhap thong tin Box2
Box2.setChieuDai(12.0);
Box2.setChieuRong(13.0);
Box2.setChieuCao(10.0);

//hien thi thong tin cac Box boi su dung phuong thuc nap chong ToString():
Console.WriteLine("Thong tin Box 1: {0}", Box1.ToString());
Console.WriteLine("Thong tin Box 2: {0}", Box2.ToString());

// tinh the tich Box1
the_tich = Box1.tinhTheTich();
Console.WriteLine("The tich cua Box1 la: {0}", the_tich);

// tinh the tich Box2
the_tich = Box2.tinhTheTich();
Console.WriteLine("The tich cua Box2 la: {0}", the_tich);

// cong hai doi tuong
Box3 = Box1 + Box2;
Console.WriteLine("Thong tin Box 3: {0}", Box3.ToString());

// tinh the tich cua Box3
the_tich = Box3.tinhTheTich();
Console.WriteLine("The tich cua Box3 la: {0}", the_tich);

//so sanh cac Box
if (Box1 > Box2)
Console.WriteLine("Box1 la lon hon Box2");
else
Console.WriteLine("Box1 la khong lon hon Box2");

if (Box1 < Box2)
Console.WriteLine("Box1 la nho hon Box2");
else
Console.WriteLine("Box1 la khong nho hon Box2");

if (Box1 >= Box2)
Console.WriteLine("Box1 la lon hon hoac bang Box2");
else
Console.WriteLine("Box1 la khong lon hon hoac bang Box2");

if (Box1 <= Box2)
Console.WriteLine("Box1 la nho hon hoac bang Box2");
else
Console.WriteLine("Box1 la khong nho hon hoac bang Box2");

if (Box1 != Box2)
Console.WriteLine("Box1 la khong bang Box2");
else
Console.WriteLine("Box1 bang Box2");
Box4 = Box3;

if (Box3 == Box4)
Console.WriteLine("Box3 bamg Box4");
else
Console.WriteLine("Box3 la khong bang Box4");

Console.ReadKey();
}
}
}


Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

nap-chong-toan-tu-1.PNG

Trên đây là bài viết giới thiệu về nạp chồng toán tử, hi vọng qua bài viết này các bạn sẽ có thêm nhiều kiến thức để ứng dụng một cách thành thạo vào bài toán của mình. Chúc các bạn học tập tốt!

Nguồn: vietjack.com​
 

Chủ đề mới

VnKienthuc lúc này

Không có thành viên trực tuyến.

Định hướng

Diễn đàn VnKienthuc.com là nơi thảo luận và chia sẻ về mọi kiến thức hữu ích trong học tập và cuộc sống, khởi nghiệp, kinh doanh,...
Top