Ví dụ:Thực hiện phép cộng hai phân số, đảm bảo thực hiện được các phép toán số học trên lớp đối tượng này, đồng thời có thể viết toán tử “+” như các phép tính số học khác... Đặt vấn đề
Trang 1Chương 5:
Nạp chồng toán tử
Gi ả ng viên: Ths Nguyễn Thị Khiêm Hòa
Trang 2Nội dung
Từ khóa Operator
Hỗ trợ ngôn ngữ NET khác
Toán tử so sánh bằng
Toán tử chuyển đổi
Trang 3Đặt vấn đề
Lớp do người dùng định nghĩa (user class defined)
có đầy đủ chức năng của các lớp được xây dựng
sẵn
Ví dụ:Thực hiện phép cộng hai phân số, đảm bảo
thực hiện được các phép toán số học trên lớp đối
tượng này, đồng thời có thể viết toán tử “+” như
các phép tính số học khác
Trang 4Đặt vấn đề
class Phanso
{
private int tuso;
private int mauso;
public Phanso(int tu, int mau)
{
this.tuso = tu;
this.mauso = mau;
}
public override string ToString()
{
return tuso.ToString() + “/” + mauso.ToString();
Trang 5Đặt vấn đề
public Phanso Cong(Phanso rhs)
{
if(rhs.mauso!= mauso)
{ int ts = mauso*rhs.tuso + rhs.mauso*tuso;
int ms = mauso*rhs.mauso;
return new Phanso(ts,ms);
}
else
{
int ts = tuso + rhs.tuso;
return new Phanso(ts, this.mauso);
}
Trang 6Đặt vấn đề
Lời gọi phương thức:
Phanso kq = ps1.Cong(ps2);
Đảm bảo thực hiện phép cộng hai phân số
Không tự nhiên
Cần xây dựng định nghĩa các phép toán thật tự nhiên
Trang 7Toán tử Operator
Toán tử là phương thức tĩnh
Trả về kết quả thực hiện phép tính trên đối tượng
Để xây dựng toán tử thực hiện nạp chồng toán tử
Cú pháp
public static <Tên_lớp> operator<toán
tử> (<Tên_lớp> lhs, <Tên_lớp> rhs) {
// câu lệnh định nghĩa
Trang 8Toán tử operator
public static Phanso operator+(Phanso lhs, Phanso rhs) {
if(rhs.mauso!= lhs.mauso)
{ int ts = lhs.mauso*rhs.tuso + rhs.mauso*lhs.tuso; int ms = lhs.mauso*rhs.mauso;
return new Phanso(ts,ms);
}
else
{
int ts = lhs.tuso + rhs.tuso;
return new Phanso(ts, this.mauso);
Trang 9Hỗ trợ ngôn ngữ NET
Một số ngôn ngữ không hỗ trợ nạp chồng toán tử
=> cần hỗ trợ phương thức thay thế
Ví dụ:
Định nghĩa phương thức Add để thực hiện phép
cộng hai đối tượng
Trang 10Sử dụng toán tử
Không sử dụng nạp chồng toán tử tùy tiện:
Nạp chồng toán tử làm cho đối tượng trực quan
Có thể làm mã nguồn phức tạp nhập nhằng
Trang 11Nguyên tắc sử dụng toán tử
Định nghĩa toán tử trong kiểu dữ liệu giá trị, kiểu
dữ liệu được xây dựng sẵn
Nạp chồng toán tử bên trong lớp
Sử dụng tên và ký hiệu được quy ước trong CLS
Kết quả phải rõ ràng
Toán tử có tính đối xứng
Trang 12Nguyên tắc sử dụng toán tử
Cung cấp phương thức thay thế theo quy định
trong CLS
Trang 13Nguyên tắc sử dụng toán tử
Trang 14Nguyên tắc sử dụng toán tử
Trang 15Toán tử so sánh bằng
Toán tử so sánh “==“
Định nghĩa lại phương thức ảo Equals() theo cú
pháp:
public override bool Equals(object o)
{
if(!(o is <Tên_l ớ p>))
return false;
else
return this == (<Tên_l ớ p>) o;
Trang 16Toán tử chuyển đổi
Xây dựng phương thức chuyển đổi kiểu dữ liệu:
Ngầm định (implicit): Bảo đảm không mất thông tin
Cú pháp:
public static implicit operator
<tên_lớp>(<Kiểu Dl> <tên tham số>)
Tường minh (explicit): Chuyển đổi công khai, có
khả năng gây mất thông tin
Cú pháp:
Trang 17Toán tử chuyển đổi
public static implicit operator Phanso(int a) {
return new Phanso(a,1);
}
public static explicit operator int(Phanso ps) {
return ps.tuso/ps.mauso;
}
Trang 18Q&A