Giáo trình phân tích quy trình nghiên cứu tạo ra những kiểu dữ liệu mới đa hình p7 - Pdf 19

Ngôn Ngữ Lập Trình C#
Chương 6
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
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úng
ta đị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ép thự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ép toá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ực hiệ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ên như
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ết kế đựơ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 được xâ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ện kế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
Nạp Chồng Toán Tử

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ột phươ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án tử 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 đối tượ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ững hà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ách khó quản lý nếu chúng ta phá
Nạp Chồng Toán Tử
154
.
.
Ngôn Ngữ Lập Trình C#
vỡ cách thể hiện thông thường để sử dụng những toán tử. 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ới và 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 trong củ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, ta khô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án
tử 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 đối tượng
xem có bằng nhau hay không. Ngôn ngữ C# nhấn mạnh rằng nếu chúng ta thự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ới toá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 (<) thì cũng phải tạo toán tử (>)
theo từng cặp. Cũng như toán tử (>=) đi tương ứng với toán tử (<=).
Theo sau là một số luật được áp dụng để thực hiện nạp chồng toán tử:

& 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
<< LeftShift Toán tử dịch trái
>> RightShift Toán tử dịch phải
== Equals Toán tử so sánh bằng
> Compare Toán tử so sánh lớn hơn
< Compare Toán tử so sánh nhỏ hơn
!= Compare Toán tử so sánh không bằng
>= Compare Toán tử so sánh lớn hơn hay
bằng
<= Compare Toán tử so sánh nhỏ hơn hay
bằng
*= Multiply Toán tử nhân rồi gán trở lại
-= Subtract Toán tử trừ rồi gán trở lại
^= Xor Toán tử or loại trừ rồi gán lại
<<= LeftShift Toán tử dịch trái rồi gán lại
%= Mod Toán tử chia dư rồi gán lại
+= Add Toán tử cộng rồi gán lại
&= BitwiseAnd Toán tử and rồi gán lại
|= BitwiseOr Toán tử or rồi gán lại
/= Divide Toán tử chia rồi gán
Decrement Toán tử giảm
++ Increment Toán tử tăng
- Negate Toán tử phủ định một ngôi
+ Plus Toán tử cộng một ngôi
~ OnesComplement Toán tử bù
Bảng 6.1: Tóm tắt một số toán tử trong C#.

chúng ta chuyển từ kiểu long sang kiểu int một cách tường minh. Việc chuyển từ kiểu int sang
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ủa int 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ểu int phả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ủa int lư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.
Nạp Chồng Toán Tử
157
.
.


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status