3 Quá tải toán tử

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 75 - 80)

Trong C#, toán tử (operator) được định nghĩa là một phương thức tĩnh và phải trả về

kết quả. Khi chúng ta tạo một toán tử cho lớp chúng ta có thể quá tải toán tửđó tương tự như cách chúng ta quá tải hàm. Ví dụ, quá tải toán tử cộng chúng ta có thể viết như

sau:

public static PhanSo operator+(PhanSo lhs, PhanSo rhs)

Tham sốđầu tiên lhs là toán hạng bên trái và tham số thứ hai rhs là toán hạng bên phải.

Dùng từ khóa operator theo sau bởi toán tửđể chỉ quá tải toán tử. Chúng ta có thể tạo các toán tử như các toán tử logic, toán tử tương đương (==).

Ví dụ sau minh họa dùng quá tải toán tử cho ứng dụng xây dựng kiểu dữ liệu phân số: using System;

namespace ConsoleApplication6. PhanSo1 {

75

public class PhanSo

{

public int tu; private int _mau; public int mau { get { return _mau; } set { if (value == 0) {

Console.WriteLine("Mau so phai khac 0"); _mau = 1; } else _mau = value; } }

//Các phương thức tạo lập cho phân số public PhanSo()

{ }

public PhanSo(int tu, int mau) {

this.tu = tu; this.mau = mau; }

public PhanSo(PhanSo a)

{

this.tu = a.tu; this.mau = a.mau; }

//Các phương thức nhập phân số public void Nhap()

{

//Nhập giá trị cho tử

76

this.tu = int.Parse(Console.ReadLine());

//Nhập giá trị cho mẫu

Console.Ghi(" Nhap mau = ");

this.mau = int.Parse(Console.ReadLine());

}

//Chuyển phân số thành một chuỗi public override string ToString() {

return tu + "/" + mau; } (adsbygoogle = window.adsbygoogle || []).push({});

//Cộng hai phân số

public static PhanSo operator +(PhanSo a, PhanSo b)

{

PhanSo kq = new PhanSo();

kq.tu = a.tu * b.mau + a. mau * b.tu; kq.mau = a.mau * b mau;

return kq. RutGon(); }

//Cộng phân số với số x... . a/b = (a+x)/(b+x)

public static PhanSo operator +(PhanSo a, int x)

{

PhanSo kq = new PhanSo();

kq.tu = a.tu + x; kq.mau = a.mau + x; return kq.RutGon(); }

public static PhanSo operator -(PhanSo a, PhanSo b)

{

PhanSo kq = new PhanSo();

kq.tu = a.tu * b.mau - a.mau * b.tu; kq.mau = a.mau * b.mau;

return kq. RutGon(); }

public static PhanSo operator -(PhanSo a, int x)

{

PhanSo kq = new PhanSo();

kq.tu = a.tu - x; kq.mau = a.mau - x; return kq. RutGon(); }

77

public static PhanSo operator *(PhanSo a, PhanSo b)

{

PhanSo kq = new PhanSo();

kq.tu = a.tu * b.tu; kq.mau = a.mau * b.mau; return kq.RutGon(); }

//nhân phân số a với một số nguyên x a/b * x = a/b*x

public static PhanSo operator *(PhanSo a, int x)

{

PPhanSo tam = new PhanSo((PhanSo)x);

return a * tam(); } (adsbygoogle = window.adsbygoogle || []).push({});

public static PhanSo operator /(PhanSo a, PhanSo b)

{

return a * b.NghichDao(); }

//chia phân số a với một số nguyên x a/b chia x = a/b*x

public static PhanSo operator /(PhanSo a, int x)

{

PhanSo tam = new PhanSo((PhanSo)x);

return a * tam.NghichDao(); }

public static PhanSo operator ++(PhanSo a)

{

PhanSo kq = new PhanSo();

kq.tu = a. tu + 1; kq.mau = a. mau + 1; return kq.RutGon(); }

public static PhanSo operator --(PhanSo a)

{

PhanSo kq = new PhanSo();

kq.tu = a.tu--; kq.mau = a.mau--; return kq;

78

//Chuyển số nguyên thành phân số

public static implicit operator PhanSo(int a)

{

PhanSo kq = new PhanSo();

kq.tu = a; kq.mau = 1; return kq; }

//Chuyển phân số thành số thực

public static explicit operator double(PhanSo a)

{

return ((double)a.tu / (double)a.mau); }

public PhanSo RutGon()

{

int us = this.USCLN();

PhanSo tam = new PhanSo(); (adsbygoogle = window.adsbygoogle || []).push({});

tam.tu = this.tu / us; tam.mau = this.mau / us; return tam;

}

private int USCLN() {

int a, b;

//Kiểm tra trường hợp nếu tử và mẫu âm a = tu > 0 ? tu: -tu;

b = mau > 0 ? mau: -mau; while (a != b) { if (a > b) a = a - b; if (b > a) b = b - a; } return a; }

public PhanSo NghichDao()

{

PhanSo kq = new PhanSo();

kq.tu = this.mau; kq.mau = this.tu; return kq;

79 } } } using System; namespace ConsoleApplication6.PhanSo1 {

public class KiemTra {

public KiemTra() {

}

public static void KiemTraPhuongThucCong() {

PhanSo ps1 = new PhanSo(-16, 5);

Console.WriteLine("Phan so thu nhat 1"+ ps1);

PhanSo ps2 = new PhanSo(20, 2);

Console.WriteLine("Phan so thu nhat 2 "+ ps2);

Console.WriteLine("Cong phan so mot va hai "+ (ps1 + ps2)); }

} }

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 75 - 80)