Danh mục tài liệu

Nạp chồng toán tử phần đầu

Số trang: 7      Loại file: pdf      Dung lượng: 196.72 KB      Lượt xem: 7      Lượt tải: 0    
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

NẠP CHỒNG TOÁN TỬ · · · · · · Sử dụng từ khóa operator Hỗ trợ ngôn ngữ .NET khác Sử dụng toán tử Toán tử so sánh bằng Toán tử chuyển đổi Câu hỏi & bài tập
Nội dung trích xuất từ tài liệu:
Nạp chồng toán tử phần đầuNẠP CHỒNG TOÁN TỬ · Sử dụng từ khóa operator · Hỗ trợ ngôn ngữ .NET khác · Sử dụng toán tử · Toán tử so sánh bằng · Toán tử chuyển đổi · Câu hỏi & bài tập Hướng thiết kế của ngôn ngữ C# là tất cả các lớp do người dùng định nghĩa(user- defined classes) có tất cả các chức năng của các lớp đựơc xây dựng sẵn. Ví dụ,giả sử chúngta định nghĩa một lớp để thể hiện một phân số. Để đảm bảo rằng lớp này có tất cảcác chức năng tương tự như các lớp được xây dựng sẵn, nghĩa là chúng ta cho phépthực hiện các phép toán số học trên các thể hiện của phân số chúng ta (như các phéptoán cộng phân số, nhân hai phân số,...) và chuyển đổi qua lại giữa phân số và kiểu dữliệu xây dựng sẵn như kiểu nguyên (int). Dĩ nhiên là chúng ta có thể dễ dàng thựchiện các toán tử bằng cách gọi một phương thức, tương tự như câu lệnh sau: Fraction theSum = firstFraction.Add( secondFraction );Mặc dù cách thực hiện này không sai nhưng về trực quan thì rất tệ không được tự nhiênnhư kiểu dữ lịêu được xây dựng sẵn. Cách thực hiện sau sẽ tốt hơn rất nhiều nếu ta thiếtkế đựơc: Fraction theSum = firstFraction + secondFraction; Cách thực hiện này xem trực quan hơn và giống với cách thực hiện của các lớp đượcxây dựng sẵn, giống như khi thực hiện phép cộng giữa hai số nguyên int.Trong chương này chúng ta sẽ tìm hiểu kỹ thuật thêm các toán tử chuẩn vào kiểu dữliệu do người dùng định nghĩa. Và chúng ta sẽ tìm hiểu các toán tử chuyển đổi đểchuyển đổi kiểu dữ liệu do người dùng định nghĩa một cách tường minh hay ngầmđịnh sang các kiểu dữ liệu khác.Sử dụng từ khóa operator Trong ngôn ngữ C#, các toán tử là các phương thức tĩnh, giá trị trả về của nó thể hiệnkết quả của một toán tử và những tham số là các toán hạng. Khi chúng ta tạo một toán tửcho một lớp là chúng ta đã thực việc nạp chồng (overloaded) những toán tử đó, cũnggiống như là chúng ta có thể nạp chồng bất cứ phương thức thành viên nào. Do đó, đểnạp chồng toán tử cộng (+) chúng ta có thể viết như sau: public static Fraction operator + ( Fraction lhs, Fraction rhs) Trong toán tử trên ta có sự qui ước đặt tên của tham số là lhs và rhs. Tham số tên lhs thaythế cho “left hand side” tức là toán hạng bên trái, tương tự tham số tên rhs thay thế cho“right hand side” tức là toán hạng bên phải. Cú pháp ngôn ngữ C# cho phép nạp chồng một toán tử bằng cách viết từ khóa operatorvà theo sau là toán tử được nạp chồng. Từ khóa operator là một bổ sung phươngthức(method operator). Như vậy, để nạp chồng toán tử cộng (+) chúng ta có thể viếtoperator +. Khi chúng ta viết: Fraction theSum = firstFraction + secondFraction; Thì toán tử nạp chồng + được thực hiện, với firstFraction được truyền vào như làtham số đầu tiên, và secondFraction được truyền vào như là tham số thứ hai. Khitrình biên dịch gặp biểu thức: firstFraction + secondFractionthì trình biên dịch sẽ chuyển biểu thức vào: Fraction.operator+(firstFraction, secondFraction) Kết quả sau khi thực hiện là một đối tượng Fraction mới được trả về, trong trườnghợp này phép gán sẽ được thực hiện để gán một đối tượng Fraction cho theSum. Ghi chú: Đối với người lập trình C++, trong ngôn ngữ C# không thể tạo được toán tử nonstatic, và do vậy 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ả năng cho phép nạp chồng toán tử cho các lớp mà chúngta xây dựng, thậm chí điều này không hoặc đề cập rất ít trong Common LanguageSpecification (CLS). Những ngôn ngữ .NET khác như VB.NET thì không hỗ trợ việcnạp chồng toán tử, và một điều quan trọng để đảm bảo là lớp của chúng ta phải hỗ trợcác phương thức thay thế cho phép những ngôn ngữ khác có thể gọi để tạo ra các hiệuứng tương tự. Do đó, nếu chúng ta nạp chồng toán tử (+) thì chúng ta nên cung cấp mộtphương thức Add() cũng làm cùng chức năng là cộng hai đối tượng. Nạp chồng toántử có thể là một cú pháp ngắn gọn, nhưng nó không chỉ là đường dẫn cho những đốitượng của chúng ta thiết lập một nhiệm vụ được đưa ra.Sử dụng toán tử Nạp chồng toán tử có thể làm cho mã nguồn của chúng ta trực quan và nhữnghành động của lớp mà chúng ta xây dựng giống như các lớp được xây dựng sẵn.Tuy nhiên, việc nạp chồng toán tử cũng có thể làm cho mã nguồn phức tạp một cáchkhó quản lý nếu chúng ta phá vỡ cách thể hiện thông thường để sử dụng những toántử. Hạn chế việc sử dụng tùy tiện các nạp chồng toán tử bằng những cách sử dụng mớivà những cách đặc trưng. Ví dụ, mặc dù chúng ta có thể hấp dẫn bởi việc sử dụng nạp chồng toán tử gia tăng (++) trong lớp Employee để gọi một phương thức gia tăng mức lương của nhân viên, điều này cóthể đem lại rất nhiều nhầm lẫn cho các lớp client truy cập lớp Employee. Vì bên trongcủa lớp còn có thể có nhiều trường thuộc tính số khác, như số tuổi, năm làm việc,...takhông thể dành toán tử gia tăng duy nhất cho thụôc tính lương được. Cách tốt nhất làsử dụng nạp chồng toántử một cách hạn chế, và chỉ sử dụng khi nào nghĩa nó rõ ràng và phù hợp với các toán tửcủa các lớp được xây dựng sẵn. Khi thường thực hiện việc nạp chồng toán tử so sánh bằng (==) để kiểm tra hai đốitượng xem có bằng nhau hay không. Ngôn ngữ C# nhấn mạnh rằng nếu chúng tathực hiện nạp chồng toán tử bằng, thì chúng ta phải nạp chồng toán tử nghịch vớitoán tử bằng là toán tử không bằng (!=). Tương tự, khi nạp chồng toán tử nhỏ hơn() theo từng cặp. Cũng như toán tử (>=) đi tương ứngvới toán tử (, =. Phải cung cấp các phương thức thay thế cho toán tử được nạp chồng. Đa số các ngôn ngữ điều không hỗ trợ nạp chồng toán tử. Vì nguyên do này nên chúng ta phải thực thi các phương thức thứ hai có cùng chức năng với các toán tử. Common Language Specification (CLS) đòi hỏi phải thực hiện phươ ...