
Nạp chồng toán hạng
Điểm nổi bật của nạp chồng toán hạng là không phải lúc nào bạn cũng muốn
gọi các phương thức hay thuộc tính trên các thể hiện lớp. Chúng ta thường
cần làm một số công việc như cộng các số lượng với nhau, nhân chúng hay
thực hiện một số toán hạn logic như so sánh các đối tượng. Ví dụ ta định
nghĩa một lớp mô tả ma trận toán học. Các ma trận thì có thể cộng, nhân với
nhau như các số, nên ta có thể viết đoạn mã như sau:
Matrix a, b, c;
// assume a, b and c have been initialized
Matrix d = c * (a + b);
Bằng nạp chồng các toán hạng ta có thể làm cho trình biên dịch biết những
gì mà + và * làm đối với một ma trận, và bạn có thể viết đoạn mã như trên.
Nếu như không sử dụng toán hạng nạp chồng như trên, ta cũng có thể định

nghĩa các phương thức để thực hiện các toán hạng trên nhưng nó sẽ có rất
nhiều hỗn độn:
Matrix d = c.Multiply(a.Add(b));
Các toán hạng như + và * rất khắc khe với các kiểu dữ liệu định nghĩa trước,
và do đó trình biên dịch sẽ tự động biết ý nghĩa của các toán hạng dựa trên
các kiểu dữ liệu đó. Ví dụ như nó biết cách để cộng hai số kiểu long, hay
cách để chia một số kiểu double cho một số kiểu double. Khi chúng ta định
nghĩa lớp hay struct chúng ta phải nói với trình biên dịch mọi thứ như:
những phương thức nào có thể được gọi, những trường nào được lưu trữ với
mọi thực thể và vân vân. Nếu chúng ta sử dụng các toán hạng như +, * trong
lớp của chúng ta. Chúng ta phải nói với trình biên dịch biết ý nghĩa của
những toán hạng có liên quan trong ngữ cảnh của lớp đó. Và cách chúng ta
làm là định nghĩa nạp chồng cho các toán hạng.
Một số trường hợp chúng ta nên viết các toán hạng nạp chồng:
1. Trong thế giới toán học, mọi đối tượng toán học như: tọa độ, vector, ma
trận, hàm số và vân vân. Nếu bạn viết chương trình làm những mô hình toán
học hay vật lý, bạn nhất định sẽ mô tả những đối tượng này.
2.Những chương trình đồ hoạ sẽ sử dụng các đối tượng toán học và toạ độ
khi tính toán vị trí của trên màn hình.

3. Một lớp mô tả số lượng tiền.
4. Việc sử lý từ hay chương trình phân tích văn bản có lớp để mô tả các câu
văn, mệnh đề và bạn phải sử dụng các toán hạng để liên kết các câu lại với
nhau.
Cách hoạt động của các toán hạng :
Để hiểu cách nạp chồng toán hạng, chúng ta phải nghĩ về những gì xảy ra
khi trình biên dịch gặp một toán hạng - :
int a = 3;
uint b = 2;
double d = 4.0;
long l = a + b;
double x = d + a;
Xem dòng lênh:
long l = a + b;
Việc thực hiện a+b như trên là rất trực quan, đó là một cú pháp tiện lợi để
nói rằng chúng ta đang gọi phương thức cộng hai số.
Trình biên dịch sẽ thấy nó cần thiết để cộng hai số nguyên và trả về số kiểu
long. Ta thấy đây là phép cộng hai số kiểu integer và kết quả cũng là một số
integer nhưng nó ép kiểu sang kiểu long và điều này thì cho phép trong C#.

Xét dòng lệnh:
double x = d + a;
Ta thấy trong nạp chồng này có số kiểu double và kiểu integer, cộng chúng
lại và trả về kiểu doube. Chúng ta cần phải đổi kiểu int sang kiểu double sau
đó cộng hai số đó lại với nhau. Và chúng ta nhận ra sự nạp chồng của toán tử
cộng ở đây như là một phiên bản của toán tử nhận hai số double như hai
tham số. Và trình biên dịch phải chắc là nó có thể ép kiểu kết quả về một
kiểu thích hợp nếu cần.
Xét đoạn mã sau:
Vector vect1, vect2, vect3;
// initialise vect1 and vect2
vect3 = vect1 + vect2;
vect1 = vect1*2;
Ở đây vector là một struct, trình biên dịch cần phải cộng hai vector vect1 và
vect2 với nhau. Và nó sẽ tìm một nạp chồng của toán hạng + lấy hai vector
như tham số của nó. Và toán hạng này trả về một vector khác. Bởi vậy trình
biên dịch cần tìm một định nghĩa của toán hạng có dạng như sau:
public static Vector operator + (Vector lhs, Vector rhs)

Nếu tìm ra nó sẽ thực thi toàn hạng đó. Nếu không nó sẽ sử dụng bất kỳ nạp
chồng của toán hạng + nào có hai tham số kiểu dữ liệu khác và có thể
chuyển sang thực thể vector. Nếu không tìm được cái nào thích hợp thì nó sẽ
báo lỗi.
Ví dụ về nạp chồng toán hạng : struct Vector
Chúng ta sẽ định nghĩa một struct Vector, nó mô tả một vector ba chiều.
Một vector ba chiều là một tập hợp ba con số kiểu double. Các biến mô tả
các con số được gọi là x, y, z. Liên kết ba con số lại với nhau và để chúng
tạo thành một vector toán học.
Sau đây là định nghĩa cho Vector- chứa các trường thành viên, contructor, và
một phương thức ToString() overriden, vì thế chúng ta có thể dễ dàng thấy
nội dung của một vector và cuối cùng là nạp chồng toán hạn:
namespace Wrox.ProCSharp.OOCSharp
{
struct Vector
{
public double x, y, z;
public Vector(double x, double y, double z)
{