Danh mục

Hướng Đối Tượng Trong C# part 8

Số trang: 8      Loại file: pdf      Dung lượng: 156.28 KB      Lượt xem: 16      Lượt tải: 0    
10.10.2023

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 hạng : Điểm nổi bật của nạp chồng toán hạng là không phải lúc nào bạn cũng muốn gọi các phương thức hay thuộc tính trên các thể hiện lớp. Chúng ta thường cần làm một số công việc như cộng các số lượng với nhau
Nội dung trích xuất từ tài liệu:
Hướng Đối Tượng Trong C# part 8Nạp chồng toán hạng :Điểm nổi bật của nạp chồng toán hạng là không phải lúc nào bạn cũng muốn gọi cácphương thức hay thuộc tính trên các thể hiện lớp. Chúng ta thường cần làm một số côngviệc như cộng các số lượng với nhau, nhân chúng hay thực hiện một số toán hạn logicnhư so sánh các đối tượng. Ví dụ ta định nghĩa một lớp mô tả ma trận toán học. Các matrận thì có thể cộng, nhân với nhau như các số, nên ta có thể viết đoạn mã như sau:Matrix a, b, c;// assume a, b and c have been initializedMatrix d = c * (a + b);Bằng nạp chồng các toán hạng ta có thể làm cho trình biên dịch biết những gì mà + và *làm đối với một ma trận, và bạn có thể viết đoạn mã như trên. Nếu như không sử dụngtoán hạng nạp chồng như trên, ta cũng có thể định nghĩa các phương thức để thực hiệncác toán hạng trên nhưng nó sẽ có rất nhiều hỗn độn:Matrix d = c.Multiply(a.Add(b));Các toán hạng như + và * rất khắc khe với các kiểu dữ liệu định nghĩa trước, và do đótrình biên dịch sẽ tự động biết ý nghĩa của các toán hạng dựa trên các kiểu dữ liệu đó. Vídụ như nó biết cách để cộng hai số kiểu long, hay cách để chia một số kiểu double chomột số kiểu double. Khi chúng ta định nghĩa lớp hay struct chúng ta phải nói với trìnhbiên dịch mọi thứ như: những phương thức nào có thể được gọi, những trường nào đượclưu trữ với mọi thực thể và vân vân. Nếu chúng ta sử dụng các toán hạng như +, * tronglớp của chúng ta. Chúng ta phải nói với trình biên dịch biết ý nghĩa của những toán hạngcó liên quan trong ngữ cảnh của lớp đó. Và cách chúng ta làm là định nghĩa nạp chồngcho các toán hạng.Một số trường hợp chúng ta nên viết các toán hạng nạp chồng:1. Trong thế giới toán học, mọi đối tượng toán học như: tọa độ, vector, ma trận, hàm sốvà vân vân. Nếu bạn viết chương trình làm những mô hình toán học hay vật lý, bạn nhấtđịnh sẽ mô tả những đối tượng này.2.Những chương trình đồ hoạ sẽ sử dụng các đối tượng toán học và toạ độ khi tính toán vịtrí của trên màn hình.3. Một lớp mô tả số lượng tiền.4. Việc sử lý từ hay chương trình phân tích văn bản có lớp để mô tả các câu văn, mệnh đềvà bạn phải sử dụng các toán hạng để liên kết các câu lại với nhau.Cách hoạt động của các toán hạng :Để hiểu cách nạp chồng toán hạng, chúng ta phải nghĩ về những gì xảy ra khi trình biêndịch gặp một toán hạng - :int a = 3;uint b = 2;double d = 4.0;long l = a + b;double x = d + a;Xem dòng lênh:long l = a + b;Việc thực hiện a+b như trên là rất trực quan, đó là một cú pháp tiện lợi để nói rằng chúngta đang gọi phương thức cộng hai số.Trình biên dịch sẽ thấy nó cần thiết để cộng hai số nguyên và trả về số kiểu long. Ta thấyđây là phép cộng hai số kiểu integer và kết quả cũng là một số integer nhưng nó ép kiểusang kiểu long và điều này thì cho phép trong C#.Xét dòng lệnh:double x = d + a;Ta thấy trong nạp chồng này có số kiểu double và kiểu integer, cộng chúng lại và trả vềkiểu doube. Chúng ta cần phải đổi kiểu int sang kiểu double sau đó cộng hai số đó lại vớinhau. Và chúng ta nhận ra sự nạp chồng của toán tử cộng ở đây như là một phiên bản củatoán tử nhận hai số double như hai tham số. Và trình biên dịch phải chắc là nó có thể épkiểu kết quả về một kiểu thích hợp nếu cần.Xét đoạn mã sau:Vector vect1, vect2, vect3;// initialise vect1 and vect2vect3 = vect1 + vect2;vect1 = vect1*2;Ở đây vector là một struct, trình biên dịch cần phải cộng hai vector vect1 và vect2 vớinhau. Và nó sẽ tìm một nạp chồng của toán hạng + lấy hai vector như tham số của nó. Vàtoán hạng này trả về một vector khác. Bởi vậy trình biên dịch cần tìm một định nghĩa củatoán hạng có dạng như sau:public static Vector operator + (Vector lhs, Vector rhs)Nếu tìm ra nó sẽ thực thi toàn hạng đó. Nếu không nó sẽ sử dụng bất kỳ nạp chồng củatoán hạng + nào có hai tham số kiểu dữ liệu khác và có thể chuyển sang thực thể vector.Nếu không tìm được cái nào thích hợp thì nó sẽ báo lỗi.Ví dụ về nạp chồng toán hạng : struct VectorChúng ta sẽ định nghĩa một struct Vector, nó mô tả một vector ba chiều.Một vector ba chiều là một tập hợp ba con số kiểu double. Các biến mô tả các con sốđược gọi là x, y, z. Liên kết ba con số lại với nhau và để chúng tạo thành một vector toánhọc.Sau đây là định nghĩa cho Vector- chứa các trường thành viên, contructor, và một phươngthức ToString() overriden, vì thế chúng ta có thể dễ dàng thấy nội dung của một vector vàcuối cùng là nạp chồng toán hạn:namespace Wrox.ProCSharp.OOCSharp{ struct Vector { public double x, y, z; public Vector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } public Vector(Vector rhs) { x = rhs.x; y = rhs.y; z = rhs.z; } public override string ToString() { return ( + x + , + y + , + z + ); }Chú ý rằng để làm cho mọi thứ đơn giản thì mọi trường nên được khai báo public. Nênnhớ các struct không cho ph ...

Tài liệu được xem nhiều: