Danh mục

Nạp chồng toán hạng

Số trang: 14      Loại file: pdf      Dung lượng: 130.80 KB      Lượt xem: 12      Lượt tải: 0    
Jamona

Phí tải xuống: 4,000 VND Tải xuống file đầy đủ (14 trang) 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 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, nhân chúng hay thực hiện một số toán hạn logic như 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 ma trậ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,...
Nội dung trích xuất từ tài liệu:
Nạp chồng toán hạng 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, nhân chúng hay thực hiện một số toán hạn logic như 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 ma trậ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 initialized Matrix 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ụng toá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ện cá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 cho mộ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ình biê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 được lư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ư +, * trong lớ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ạng có 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ồng cho 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ên dị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úng ta đ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ểu sang 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ới nhau. 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ủa toá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ể ép kiể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 vect2 vect3 = 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ới nhau. 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ủa toá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ủa toá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 Vector Chú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án học. Sau đây là định nghĩa cho Vector- chứa các trường thành viên, contructor, và một phương thứ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ên nhớ các struct không cho phép để contructor mặc định. Do đó, tôi đã tạo hai constructor để khởi tạo giá trị cho vector bằng cách truyền giá trị cho mọi phần tử hay truyền một vector khác để sao c hép các giá trị của vector này. Bây giờ hãy xem qua một nạp chồng toán hạng: public static Vector operator + (Vector lhs, Vector rhs) { Vector result = new Vector(lhs); result.x += rhs.x; result.y += rhs.y; result.z += rhs.z; return result; } } } Nó làm việc như thế nào? Cú pháp quan trọng là trong khai báo của toán hạng. Nó được khai báo như cách khai báo một phương thức, ngoại trừ từ khoá operation sẽ nói với trình biên dịch là nó là một nạp chồng toán hạng. Toán hạng được đại diện bởi ký kiệu thực tế cho phù hợp. Kiểu trả về là kiểu mà bạn nhận được khi sử dụng toán hạng này. Trong trường hợp của chúng ta, cộng hai vector sẽ ...

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

Gợi ý tài liệu liên quan: