Danh mục

Nạp chồng toán tử phần cuối

Số trang: 10      Loại file: pdf      Dung lượng: 186.71 KB      Lượt xem: 3      Lượt tải: 0    
Thư Viện Số

Hỗ trợ phí lưu trữ khi tải xuống: 2,000 VND Tải xuống file đầy đủ (10 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Ví dụ 6.1: Định nghĩa các chuyển đổi và toán tử cho lớp Fraction.
Nội dung trích xuất từ tài liệu:
Nạp chồng toán tử phần cuối Ví dụ 6.1: Định nghĩa các chuyển đổi và toán tử cho lớp Fraction.-----------------------------------------------------------------------------using System;public class Fraction{ public Fraction(int numerator,int denominator) { Console.WriteLine(In Fraction Constructor( int, int) ); this.numerator = numerator; this.denominator = denominator; } public Fraction(int wholeNumber) { Console.WriLine(In Fraction Constructor( int )); numerator = wholeNumber; denominator = 1; } public static implicit operator Fraction( int theInt ) { Console.WriteLine( In implicit conversion to Fraction); return new Fraction( theInt ); } public static explicit operator int( Fraction theFraction ) { Console.WriteLine(In explicit conversion to int); return theFraction.numerator / theFraction.denominator; } public static bool operator == ( Fraction lhs, Fraction rhs) { Console.WriteLine(In operator ==); if ( lhs.numerator == rhs.numerator && lhs.denominator == rhs.denominator ) { return true; } // thực hiện khi hai phân số không bằng nhau return false;}public static bool operator != ( Fraction lhs, Fraction rhs){ Console.WriteLine(In operator !=); return !( lhs == rhs );}public override bool Equals( object o ){ Console.WriteLine(In method Equals); if ( !(o is Fraction )) { return false; } return this == ( Fraction ) o;}public static Fraction operator+( Fraction lhs, Fraction rhs ){ Console.WriteLine(In operator +); if (lhs.denominator == rhs.denominator ) { return new Fraction( lhs.numerator + rhs.numerator, lhs.denominator ); } //thực hiện khi hai mẫu số khộng bằng nhau int firstProduct = lhs.numerator * rhs.denominator; int secondProduct = rhs.numerator * lhs.denominator; return new Fraction( firstProduct + secondProduct, lhs.denominator * rhs.denominator);}public override string ToString(){ string s = numerator.ToString() + / + denominator.ToString(); return s; } //biến thành viên lưu tử số và mẫu số private int numerator; private int denominator;}public class Tester{ static void Main() { Fraction f1 = new Fraction( 3, 4); Console.WriteLine(f1:{0},f1.ToString() ); Fraction f2 = new Fraction( 2, 4); Console.WriteLine(f2:{0},f2.ToString() ); Fraction f3 = f1 + f2; Console.WriteLine(f1 + f2 = f3:{0},f3.ToString()); Fraction f4 = f3 + 5; Console.WriteLine(f4 = f3 + 5:{0},f4.ToString()); Fraction f5 = new Fraction( 2, 4); if( f5 == f2 ) { Console.WriteLine(f5:{0}==f2:{1} , f5.ToString(), f2.ToString()); } }}-----------------------------------------------------------------------------Lớp Fraction bắt đầu với hai hàm khởi dựng: một hàm lấy một tử số và mẫu số, cònhàm kialấy chỉ lấy một số làm tử số. Tiếp sau hai bộ khởi dựng là hai toán tử chuyển đổi.Toán tử chuyển đổi đầu tiên chuyển một số nguyên sang một phân số:public static implicit operator Fraction( int theInt ){ return new Fraction( theInt); }Sự chuyển đổi này được thực hiện một cách ngầm định bởi vì bất cứ số nguyên nàocũng có thể được chuyển thành một phân số bằng cách thiết lập tử số bằng giá trị sốnguyên và mẫu số có giá trị là 1. Việc thực hiện này có thể giao lại cho phương thức khởidựng lấy một tham số. Toán tử chuyển đổi thứ hai được thực hiện một cách tường minh,chuyển từ một Fraction ra một số nguyên: public static explicit operator int( Fraction theFraction ) { return theFraction.numerator / theFraction.denominator; }Bởi vì trong ví dụ này sử dụng phép chia nguyên, phép chia này sẽ cắt bỏ phần phân chỉlấy phần nguyên. Do vậy nếu phân số có giá trị là 16/15 thì kết quả số nguyên trả về là 1.Một số các phép chuyển đổi tốt hơn bằng cách sử dụng làm tròn số.Tiếp theo sau là toán tử so sánh bằng (==) và toán tử so sánh không bằng (!=). Chúngta nên nhớ rằng khi thực thi toán tử so sánh bằng thì cũng phải thực thi toán tử so sánhkhông bằng. Chúng ta đã định nghĩa giá trị bằng nhau giữa hai Fraction khi tử sốbằng tử số và mẫu số bằng mẫu số. Vi dụ, như hai phân số 3/4 và 6/8 thì khôngđược so sánh là bằng nhau. Một lần nữa, một sự thực thi tốt hơn là tối giản tử số vàmẫu số khi đó 6/8 sẽ đơn giản thành 3/4 và khi đó so sánh hai phân số sẽ bằngnhau.Trong lớp này chúng ta cũng thực thi phủ quyết phương thức Equals() của lớp object,do đóđối tượng Fraction của chúng ta có thể được đối xử một cách đa hình với bất cứ đốitượng khác. Trong phần thực thi của phương thức chúng ta ủy thác việc so sánh lạicho toán tử so sánh bằng cách gọi toán tử (==).Lớp Fraction có thể thực thi hết tất cả các toán tử số học như cộng, trừ, nhân, chia.Tuy nhiên, trong phạm vi nhỏ hẹp của minh họa chúng ta chỉ thực thi toán tử cộng,và thậm chí phép cộng ở đây được thực hiện đơn giản nhất. Chúng ta thử nhìn lại, nếuhai mẫu số bằng nhau thìta cộng tử số: public static Fraction operator + ( Fraction lhs, Fraction rhs) { if ( lhs.denominator == rhs.denominator) { return new Fraction( lhs.numerator + rhs.numerator, lhs.denominator); } }Nếu mẫu số không cùng nhau, thì chúng ta thực hiện nhân chéo: int firstProduct = lhs.numerator * rhs.denominator; int secondProduct = rhs.numerator * lhs.denominator; return new Fraction( firstProduct + secondProduct, lhs.denominator * rhs.denominator);Cuối cùng là sự phủ quyết phương thức ToString() của lớp object, phương thức mới nàythực hiện viết xuất ra nội dung của phân s ...

Tài liệu được xem nhiều: