Toán tử chuyển đổ

Một phần của tài liệu Giáo trình hướng dẫn các chương trình lập trình trên web để xây dưng phần mềm part 4 pps (Trang 37 - 40)

C# cho phép chuyển đổi từ kiểuint sang kiểu long một cách ngầm định, và cũng cho phép chúng ta chuyển từ kiểu long sang kiểuintmột cách tường minh. Việc chuyển từ kiểuintsang kiểu long được thực hiện ngầm định bởi vì hiển nhiên bất kỳ giá trị nào củaint cũng được thích hợp với kích thước của kiểu long. Tuy nhiên, điều ngược lại, tức là chuyển từ kiểu long

sang kiểuintphải được thực hiện một cách tường minh (sử dụng ép kiểu) bởi vì ta có thể mất thông tin khi giá trị của biến kiểu long vượt quá kích thước củaintlưu trong bộ nhớ:

int myInt = 5; long myLong;

myLong = myInt; // ngầm định myInt = (int) myLong; // tường minh

Chúng ta muốn thực hiện việc chuyển đổi này với lớp Fraction. Khi đưa ra một số nguyên, chúng ta có thể hỗ trợ ngầm định để chuyển đổi thành một phân số bởi vì bất kỳ giá trị nguyên nào ta cũng có thể chuyển thành giá trị phân số với mẫu số là 1 như (24 == 24/1). Khi đưa ra một phân số, chúng ta muốn cung cấp một sự chuyển đổi tường minh trở lại một số nguyên, điều này có thể hiểu là một số thông tin sẽ bị mất. Do đó, khi chúng ta chuyển phân số 9/4 thành giá trị nguyên là 2.

Từ ngữ ngầm định (implicit) được sử dụng khi một chuyển đổi đảm thành công mà không mất bất cứ thông tin nào của dữ liệu nguyên thủy. Trường hợp ngược lại, tường minh (explicit) không đảm bảo bảo toàn dữ liệu sau khi chuyển đổi do đó việc này sẽ được thực hiện một cách công khai.

Ví dụ 6.1 sẽ trình bày dưới đây minh họa cách thức mà chúng ta có thể thực thi chuyển đổi tường minh và ngầm định, và thực thi một vài các toán tử của lớp Fraction. Trong ví dụ này chúng ta sử dụng hàm Console.WriteLine() để xuất thông điệp ra màn hình minh họa khi phương thức được thi hành. Tuy nhiên cách tốt nhất là chúng ta sử dụng trình bebug để theo dõi từng bước thực thi các lệnh hay nhảy vào từng phương thức được gọ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) {

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 ) { (adsbygoogle = window.adsbygoogle || []).push({});

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òn hàm kia lấ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 ) {

Một phần của tài liệu Giáo trình hướng dẫn các chương trình lập trình trên web để xây dưng phần mềm part 4 pps (Trang 37 - 40)