Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
130,7 KB
Nội dung
Nạp chồng toán tử Nạp chồng toán tử Bởi: Khuyet Danh Hướng thiết kế ngôn ngữ C# tất lớp người dùng định nghĩa (userdefined classes) có tất chức lớp đựơc xây dựng sẵn Ví dụ, giả sử định nghĩa lớp để thể phân số Để đảm bảo lớp có tất chức tương tự lớp xây dựng sẵn, nghĩa cho phép thực phép toán số học thể phân số (như phép toán cộng phân số, nhân hai phân số, ) chuyển đổi qua lại phân số kiểu liệu xây dựng sẵn kiểu nguyên (int) Dĩ nhiên dễ dàng thực toán tử cách gọi phương thức, tương tự câu lệnh sau: Fraction theSum = firstFraction.Add( secondFraction ); Mặc dù cách thực không sai trực quan tệ không tự nhiên kiểu lịêu xây dựng sẵn Cách thực sau tốt nhiều ta thiết kế đựơc: Fraction theSum = firstFraction + secondFraction; Cách thực xem trực quan giống với cách thực lớp xây dựng sẵn, giống thực phép cộng hai số nguyên int Trong chương tìm hiểu kỹ thuật thêm toán tử chuẩn vào kiểu liệu người dùng định nghĩa Và tìm hiểu toán tử chuyển đổi để chuyển đổi kiểu liệu người dùng định nghĩa cách tường minh hay ngầm định sang kiểu liệu khác Sử dụng từ khóa operator Trong ngôn ngữ C#, toán tử phương thức tĩnh, giá trị trả thể kết toán tử tham số toán hạng Khi tạo toán tử cho lớp thực việc nạp chồng (overloaded) toán tử đó, giống nạp chồng phương thức thành viên Do đó, để nạp chồng toán tử cộng (+) viết sau: 1/15 Nạp chồng toán tử public static Fraction operator + ( Fraction lhs, Fraction rhs) Trong toán tử ta có qui ước đặt tên tham số lhs rhs Tham số tên lhs thay cho “left hand side” tức toán hạng bên trái, tương tự tham số tên rhs thay cho “right hand side” tức toán hạng bên phải Cú pháp ngôn ngữ C# cho phép nạp chồng toán tử cách viết từ khóa operator theo sau toán tử nạp chồng Từ khóa operator bổ sung phương thức (method operator) Như vậy, để nạp chồng toán tử cộng (+) viết operator + Khi viết: Fraction theSum = firstFraction + secondFraction; Thì toán tử nạp chồng + thực hiện, với firstFraction truyền vào tham số đầu tiên, secondFraction truyền vào tham số thứ hai Khi trình biên dịch gặp biểu thức: firstFraction + secondFraction trình biên dịch chuyển biểu thức vào: Fraction.operator+(firstFraction, secondFraction) Kết sau thực đối tượng Fraction trả về, trường hợp phép gán thực để gán đối tượng Fraction cho theSum Đối với người lập trình C++, ngôn ngữ C# tạo toán tử nonstatic, nên toán tử nhị phân phải lấy hai toán hạng Hỗ trợ ngôn ngữ NET khác Ngôn ngữ C# cung cấp khả cho phép nạp chồng toán tử cho lớp mà xây dựng, chí điều không đề cập Common Language Specification (CLS) Những ngôn ngữ NET khác VB.NET không hỗ trợ việc nạp chồng toán tử, điều quan trọng để đảm bảo lớp phải hỗ trợ phương thức thay cho phép ngôn ngữ khác gọi để tạo hiệu ứng tương tự Do đó, nạp chồng toán tử (+) nên cung cấp phương thức Add() làm chức cộng hai đối tượng Nạp chồng toán tử cú pháp ngắn gọn, không đường dẫn cho đối tượng thiết lập nhiệm vụ đưa 2/15 Nạp chồng toán tử Sử dụng toán tử Nạp chồng toán tử làm cho mã nguồn trực quan hành động lớp mà xây dựng giống lớp xây dựng sẵn Tuy nhiên, việc nạp chồng toán tử làm cho mã nguồn phức tạp cách khó quản lý phá vỡ cách thể thông thường để sử dụng toán tử Hạn chế việc sử dụng tùy tiện nạp chồng toán tử cách sử dụng cách đặc trưng Mặc dù hấp dẫn việc sử dụng nạp chồng toán tử gia tăng (++) lớp Employee để gọi phương thức gia tăng mức lương nhân viên, điều đem lại nhiều nhầm lẫn cho lớp client truy cập lớp Employee Vì bên lớp có nhiều trường thuộc tính số khác, số tuổi, năm làm việc, ta dành toán tử gia tăng cho thụôc tính lương Cách tốt sử dụng nạp chồng toán tử cách hạn chế, sử dụng nghĩa rõ ràng phù hợp với toán tử lớp xây dựng sẵn Khi thường thực việc nạp chồng toán tử so sánh (==) để kiểm tra hai đối tượng xem có hay không Ngôn ngữ C# nhấn mạnh thực nạp chồng toán tử bằng, phải nạp chồng toán tử nghịch với toán tử toán tử không (!=) Tương tự, nạp chồng toán tử nhỏ () theo cặp Cũng toán tử (>=) tương ứng với toán tử (, = 3/15 Nạp chồng toán tử Phải cung cấp phương thức thay cho toán tử nạp chồng Đa số ngôn ngữ điều không hỗ trợ nạp chồng toán tử Vì nguyên nên phải thực thi phương thức thứ hai có chức với toán tử Common Language Specification (CLS) đòi hỏi phải thực phương thức thứ hai tương ứng Bảng sau trình bày toán tử với biểu tượng toán tử tên phương thức thay toán tử Biểu tượng Tên phương thức thay Tên toán tử + Add Toán tử cộng - Subtract Toán tử trừ * Multiply Toán tử nhân / Divide Toán tử chia % Mod Toán tử chia lấy dư ^ Xor Toán tử or loại trừ & BitwiseAnd Toán tử and nhị phân | BitwiseOr Toán tử or nhị phân && And Toán tử and logic || Or Toán tử or logic = Assign Toán tử gán > RightShift Toán tử dịch phải == Equals Toán tử so sánh > Compare Toán tử so sánh lớn < Compare Toán tử so sánh nhỏ != Compare Toán tử so sánh không >= Compare Toán tử so sánh lớn haybằng [...]... khi xây dựng các lớp chúng ta chỉ cần dùng nạp chồng toán tử với các chức năng tính toán ? Đúng là như vậy, việc thực hiện nạp chồng toán tử rất tự nhiên và trực quan Tuy nhiên một số ngôn ngữ NET như VB.NET không hỗ trợ việc nạp chồng toán tử nên, tốt nhất nếu muốn cho lớp trong C# của chúng ta có thể được gọi từ ngôn ngữ khác không hỗ trợ nạp chồng toán tử thì nên xây dựng các phương thức tương đương... các phép chuyển đổi tốt hơn bằng cách sử dụng làm tròn số 11/15 Nạp chồng toán tử 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úng ta 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ánh khô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ì... điều lưu ý nào khi sử dụng nạp chồng toán tử trong một lớp? Nói chung là khi nào thật cần thiết và ít gây ra sự nhầm lẫn Ví dụ như ta xây dựng lớp Employee có nhiều thuộc tính số như lương, thâm niên, tuổi Chúng ta muốn xây dựng toán tử ++ cho lương nhưng có thể làm nhầm lẫn với việc tăng số năm công tác, hay 14/15 Nạp chồng toán tử tăng tuổi Do vậy việc sử dụng nạp chồng toán tử cũng phải cân nhắc tránh... chuyển đổi ngầm định? Có thể tạo ra ký hiện toán tử riêng của ta và thực thi nạp chồng toán tử đó hay không? Có bao nhiêu toán tử mà NET quy định? Ký hiệu của từng toán tử? Bài tập Hãy tiếp tục phát triển lớp Fraction trong ví dụ của chương bằng cách thêm các toán tử khác như trừ, nhân, chia, so sánh Xây dựng lớp điểm trong không gian hai chiều, với các toán tử cộng, trừ, nhân, chia Tương tự như bài... xây dựng toán tử so sánh thì có phải chỉ cần dùng toán tử so sánh bằng? Đúng là nếu cần dùng toán tử so sánh nào thì chúng ta có thể chỉ tạo ra duy nhất toán tử so sánh đó mà thôi Tuy nhiên, tốt hơn là chúng ta cũng nên xây dựng thêm toán tử so sánh khác như: so sánh khác, so sánh nhỏ hơn, so sánh lớn hơn Việc này sẽ làm cho lớp của chúng ta hoàn thiện hơn Câu hỏi thêm Khi nào sử dụng toán tử chuyển.. .Nạp chồng toán tử Fraction f5 = new Fraction( 2, 4); if( f5 == f2 ) { Console.WriteLine("f5:{0}==f2:{1}", f2.ToString()); f5.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... Toán tử chuyển đổi ngầm định được gọi khi chuyển 5 thành một phân số Phân số được tạo ra từ toán tử chuyển đổi ngầm định này gọi phương thức khởi dựng một tham số để tạo phân số mới 5/1 Phân số mới này sẽ được chuyển thành toán hạng trong phép cộng với phân số f3 và kết quả trả về là phân số f4 là tổng của hai phân số trên Thử nghiệm cuối cùng là tạo một phân số mới f5, rồi sau đó gọi toán tử nạp chồng. .. tiếp theo trong hàm Main() sẽ gọi toán tử cộng, đây là phương thức tĩnh Mục đích của toán tử này là cộng hai phân số và trả về một phân số mới là tổng của hai phân số đưa vào: Fraction f3 = f1 + f2; Console.WriteLine("f1 + f2 = f3: {0}", f3.ToString()); Hai câu lệnh trên sẽ cho ra kết quả như sau: In operator + In Fraction Constructor( int, int) f1 + f2 = f3: 5/4 Toán tử + được gọi trước sau đó đến phương... : tử số / mẫu số: public override string ToString() { string s = numerator.ToString() + "/" + denominator.ToString(); return s; } Chúng ta tạo một chuỗi mới bằng cách gọi phương thức ToString() của numerator Do numerator là một đối tượng, nên trình biên dịch sẽ ngầm định thực hiện boxing số nguyên numerator và sau đó gọi phương thức ToString(), trả về một chuỗi thể hiện giá 12/15 Nạp chồng toán tử. .. tối giản tử số và mẫu số khi đó 6/8 sẽ đơn giản thành ¾ và khi đó so sánh hai phân số sẽ bằng nhau 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ứ đối tượ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ại cho toán tử so sánh bằng cách gọi toán tử (==) Lớp ... thực nạp chồng toán tử bằng, phải nạp chồng toán tử nghịch với toán tử toán tử không (!=) Tương tự, nạp chồng toán tử nhỏ () theo cặp Cũng toán tử (>=) tương ứng với toán tử. .. hoàn toàn nghĩa hết Nạp chồng toán tử có tính chất đối xứng Ví dụ, nạp chồng toán tử (==) phải nạp chồng toán tử không (!=) Do thực toán tử có tính chất đối xứng phải thực toán tử đối xứng lại như:... bày toán tử với biểu tượng toán tử tên phương thức thay toán tử Biểu tượng Tên phương thức thay Tên toán tử + Add Toán tử cộng - Subtract Toán tử trừ * Multiply Toán tử nhân / Divide Toán tử chia