01/06/2006 N g ôn n gữ C # 2N ạp chồng tác tử operator overloading n L àm cho các class tự tạo userL àm cho các class tự tạo user--defined class có thể defined class có thể thự c hiện đư
Trang 1N gôn ngữ C #
T rần V ăn T èo tvteo@agu.edu.vn
Trang 201/06/2006 N g ôn n gữ C # 2
N ạp chồng tác tử (operator overloading)
n L àm cho các class tự tạo (userL àm cho các class tự tạo (user defined class) có thể defined class) có thể
thự c hiện đư ợ c tất cả các chứ c năng của các kiểu dữ liệu bẩm sinh (built
liệu bẩm sinh (built in type).in type)
n X ây dự ng hàm :
Fraction theSum = = firstFraction Add (secondFraction)
n T ự nhiên và nhất quán vớ i kiểu dữ liệu bẩm sinh:
Fraction theSum = = firstFraction + secondFraction
Trang 3S ử dụng từ khóa
S ử dụng từ khóa operator operator
n C ác tác tử là nhữ ng hàm C ác tác tử là nhữ ng hàm static static, có trị trả về là kết , có trị trả về là kết
quả của m ột tác vụ vớ i các thông số là các tác tố
V í dụ:
n C ú pháp: Đ ặt từ khóa operator trư ớ c tác tử cần
nạp chồng
V í dụ:
V í dụ: operator+ , operator>= , operator+=operator+ , operator>= , operator+=
Fraction theSum = = firstFraction + secondFraction
public static Fraction operator+ ( Fraction lhs, Fractino rhs )
Fraction theSum = Fraction operator +(firstFraction, secondFraction)
lhs firstFraction rhs secondFraction
Trang 401/06/2006 N g ôn n gữ C # 4
T ác tử quan hệ (R elational O perator)
n N ếu đã overload tác tử bằng (= = ) thì nên override
luôn hàm virtual E quals() của lớ p O bject
n C ho phép lớ p bạn m ang tính đa hình và tư ơ ng thích
vớ i các ngôn ngữ N E T khác không hổ trợ nạp
chồng tác tử
public override bool Equals( object obj) {
if ( ! (obj is Fraction) ) {
return false ; }
return this == (Fraction)obj;
}
Trang 5T ác tử logic (L ogical operator)
n H ai tác tử H ai tác tử && && và và |||| không thể overloading trự c tiếp
n P hải định nghĩa 4 tác tử : P hải định nghĩa 4 tác tử : & , & , || , true , false.
n H ai tác tử & & và |||| tự động tính như sau:
•• x && y T.false(x) ? x : T.&(x,y) T.false(x) ? x : T.&(x,y)
•• x || y T.true(x) ? x : T.|(x,y) T.true(x) ? x : T.|(x,y)
public static Fraction operator & (F ra ctio n a , F ra ctio n b){… … }
public static Fraction operator | (F ractio n a , F ra ction b){… … }
public static Fraction operator true (F ra ctio n a , F ractio n b ){… … }
public static Fraction operator false (F ractio n a , F raction b){… … }
public static Fraction operator ! (F ractio n a ){… … }
K h ô n g cầ n :
public static Fraction operator && (Fraction a, Fraction b)
Trang 601/06/2006 N g ôn n gữ C # 6
C huyển đổi các tác tử
int myInt = 5;
long myLong = 7;
myLong = myInt ; //implicit
myInt = myLong ; ???? myInt = ( int )myLong ; //explicit
Đ ịn h n g h ĩa : public static Fraction operator + ( Fraction lhs , Fraction rhs ) Khai báo: Fraction a,b; int Sum;
T h ự c h iệ n : b = a + 3;
Sum = a + b;
public static implicit operator Fraction ( int th eIn t) {… }
public static explicit operator int ( Fraction frc) {… }
b = a + 3; Sum = ( int )(a + b);
Trang 7Q & A