Lập trình .NET và C#
Lecture 6: NẠP CHỒNG TOÁN TỬ TS Đào Nam Anh UTM, Khoa KH&CN
1
Resources
(cid:1) Các giải pháp lập trình C#, Nguyễn Ngọc Bình Phương - Thái Thanh Phong (cid:1) Allen Jones. C# Programmer's Cookbook. Microsoft Press, 2004 (cid:1)
John Connell. Coding Techniques for Microsoft Visual Basic .NET. Microsoft Press, 2002.
(cid:1) Harvey M. Deitel, Paul J. Deitel, & Tem R. Nieto. Visual Basic .NET How to
(cid:1)
(cid:1)
Program, Second Edition. Prentice Hall, 2002. Jose Mojica. C# and VB .NET Conversion Pocket Reference. O'Reilly, 2002. James Avery. Ten Must-Have Tools Every Developer Should Download Now. MSDN Magazine, 2004.
(cid:1) Karl Moore. The Ultimate VB.NET and ASP.NET Code Book. Apress, 2003 (cid:1) Matthew MacDonald. Microsoft Visual Basic .NET Programmer's Cookbook.
Microsoft Press, 2003.
(cid:1) Mark Schmidt & Simon Robinson. Microsoft Visual C# .NET 2003 Developer's
Cookbook. Sams Publishing, 2003.
(cid:1) Dương Quang Thiện. Lập trình Visual C# thế nào? Nhà xuất bản Tổng Hợp TP.
Hồ Chí Minh, 2005.
(cid:1) Nguyễn Ngọc Bình Phương & Lê Trần Nhật Quỳnh. Các giải pháp lập trình
Visual Basic .NET. Nhà xuất bản Giao thông Vận tải, 2006
(cid:1) www.msdn.microsoft.com, www.codeproject.com, www.msd2d.com,
www.developersdex.com, www.windowsforms.net, www.gotdotnet.com, www.codeguru.com, www.developerfusion.com
2
(cid:1) Sử dụng từ khóa operator (cid:1) Hỗ trợ ngôn ngữ .NET khác (cid:1) Sử dụng toán tử (cid:1) Toán tử so sánh bằng (cid:1) Toán tử chuyển đổi
3
NẠP CHỒNG TOÁN TỬ
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.
4
NẠP CHỒNG TOÁN TỬ
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 lớp là
5
chúng ta đa thực việc nạp chồng (overloaded) những toán tử đó, cũng giố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.
Sử dụng từ khóa operator
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)
6
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 thay thế 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.
Sử dụng từ khóa operator
public static Fraction operator + (Fraction
lhs, Fraction rhs)
Fraction theSum = firstFraction +
7
secondFraction;
Hỗ trợ ngôn ngữ .NET khác
(cid:1) C# cung cấp khả năng cho phép nạp chồng
(cid:1) Những ngôn ngữ .NET khác như VB.NET thì
toán tử cho các lớp
8
không hỗ trợ việc nạp chồng toán tử
Hỗ trợ ngôn ngữ .NET khác
(cid:1) 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.
(cid:1) Nếu chúng ta nạp chồng toán tử (+) thì 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.
9
Sử dụng toán tử
10
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
Sử dụng 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 << LeftShift Toán tử dịch trái >> RightShift Toán tử dịch phải
11
Toán tử so sánh bằng
12
Nếu chúng ta nạp chồng toán tử bằng (==), thì chúng ta cũng nên phủ quyết phương thức ảo Equals() được cung cấp bởi lớp object và chuyển lại cho toán tử bằng thực hiện.
Toán tử so sánh bằng
if ( !(o is Fraction) ) {
return false;
} return this == (Fraction) o;
pubic override bool Equals (object o) {
13
}
Toán tử chuyển đổi
C# cho phép chuyển đổi từ kiểu int 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ể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, 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ớ:
14
Toán tử chuyển đổi
15
int myInt = 5; long myLong; myLong = myInt; // ngầm định myInt = (int) myLong; // tường minh
Question
16