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 bn cũng muốn
gọi các phương thức hay thuộc tính trên các thhin lớp. Chúng ta thường
cần làm một scông việc như cộng các slượng với nhau, nhân chúng hay
thực hin một số toán hạn logic như so sánh các đi tượng. Ví dta định
nghĩa một lớp tả ma trận tn học. Các ma trận thì thcộng, nhân với
nhau như các số, nên ta có thviế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 thể làm cho trình biên dịch biết những
+ * làm đối với một ma trận, và bạn có thể viết đoạn mã như tn.
Nếu như không sdụng toán hạng nạp chồng như trên, ta cũng 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ó srất
nhiều hỗn đn:
Matrix d = c.Multiply(a.Add(b));
Các toán hng như + * rất khắc khe với các kiểu dữ liệu định nghĩa trước,
do đó trình bn 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 dliệu đó. dnhư biết cách để cng hai số kiểu long, hay
cách để chia một số kiểu double cho một skiểu double. Khi chúng ta định
nghĩa lớp hay struct chúng ta phải nói với trình bn 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 trvới
mọi thực thể và vân vân. Nếu chúng ta sdụ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 ngcảnh của lớp đó. Và 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ế gii toán học, mọi đối tượng toán học như: tọa độ, vector, ma
trận, hàm svà vân vân. Nếu bạn viết chương trình làm nhng 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.Nhng chương trình đồ hoạ ssử 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ử từ hay chương trình phân tích văn bản lớp để mô tả các câu
văn, mnh đề và bn phải sử dụng 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;
Xemng lênh:
long l = a + b;
Việc thực hiện a+b như trên rất trực quan, đó là một cú pháp tiện lợi để
nói rng chúng ta đang gọi phương thức cộng hai số.
Trình biên dịch sẽ thấy cn thiết để cộng hai số nguyên trvề skiểu
long. Ta thấy đây là phép cng hai số kiểu integer kết quả cũng là một số
integer nhưng nó ép kiểu sang kiểu long đ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 skiểu double kiểu integer, cộng chúng
li và trvề kiểu doube. Chúng ta cn 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 bn của toán tử nhn hai sdouble như hai
tham số. Và trình biên dịch phải chắc là 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 một struct, trình biên dịch cần phải cộng hai vector vect1
vect2 vi nhau. Và stìm mt 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 trvề 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 hng có dạng như sau:
public static Vector operator + (Vector lhs, Vector rhs)
Nếu tìm ra sthực thi toàn hng đó. Nếu kng sẽ sử dụng bất knạp
chồng của toán hạng + nào hai tham s kiểu dữ liệu khác và th
chuyển sang thực thể vector. Nếu kng 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, 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 tả
các con sđược gọi là x, y, z. Liên kết ba con số lại với nhau để 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,
một phương thức ToString() overriden, vì thế chúng ta thể dễ dàng thy
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)
{