Toán tử quá tải C++

Nạp chồng toán tử (toán tử nạp chồng) trong C#

Đăng bởi

Mai Chi

-

09/09/2019

Facebook

Twitter

Pinterest

liên kết

ReddIt

Hướng dẫn tự học lập trình C# toàn tập Nạp chồng toán tử (nạp chồng toán tử) trong C#

Nạp chồng toán tử (toán tử nạp chồng) trong C# có khả năng định nghĩa lại hoạt động của một số toán tử để có thể áp dụng nó với các đối tượng của lớp bạn định nghĩa. Nếu bạn đã biết C++, bạn sẽ rất nhanh chóng bắt được chồng toán tử trong C#. Tuy nhiên, nếu bạn xuất phát từ Java hoặc Visual Basic, đây có thể là vấn đề mới

Bài học này sẽ giúp bạn nắm bắt được ý nghĩa của việc nạp chồng toán tử và cách thực hiện trong C#

NỘI DUNG CỦA BẢNG

Nạp tiền điện tử trong C#

Bộ sưu tập các thuật toán

Đối với các kiểu dữ liệu, C# định nghĩa sẵn một số phép toán như phép toán học, phép toán so sánh, phép toán tăng giảm. Đối với kiểu chuỗi, như chúng ta đã biết, được phép tính toán cộng gộp sẵn có

Tuy nhiên, các kiểu dữ liệu (lớp) do người dùng định nghĩa lại không thể sử dụng ngay các phép toán đó được

Ví dụ, nếu người dùng định nghĩa kiểu số phức, phép toán cơ bản trên kiểu số phức hợp lại không thể thực hiện được ngay, mặc dù về mặt toán học thì phép tính toán đối với kiểu số không có gì khác biệt với kiểu số

Để giải quyết các vấn đề tương tự, C# cho phép nạp chồng toán tử, tức là cho phép định nghĩa lại các phép toán đã có với kiểu dữ liệu do người dùng xây dựng xây dựng

Nạp chồng phương thức (nạp chồng phương thức) cùng với nạp chồng toán tử (nạp chồng toán tử) là hai đối tượng thuộc về nguyên lý đa hình tĩnh (đa hình tĩnh)

Cách nạp chồng toán tử trong C#

Hãy cùng thực hiện và phân tích ví dụ sau để hiểu cách nạp chồng toán. Chú ý xem xét cú pháp nạp đối với mỗi toán tử

using System; namespace P01_OperatorOverload { /// <summary> /// lớp biểu diễn hình hộp /// </summary> internal class Box { public double Length { get; set; } public double Breadth { get; set; } public double Height { get; set; } public Box() { } public Box(double length, double breadth, double height) { Length = length; Breadth = breadth; Height = height; } /// <summary> /// tính thể tích khối hộp /// </summary> public double Volume => Length * Breadth * Height; // nạp chồng phép cộng public static Box operator +(Box b, Box c) { Box box = new Box { Length = b.Length + c.Length, Breadth = b.Breadth + c.Breadth, Height = b.Height + c.Height }; return box; } // nạp chồng phép so sánh bằng public static bool operator ==(Box lhs, Box rhs) { bool status = false; if (lhs.Length == rhs.Length && lhs.Height == rhs.Height && lhs.Breadth == rhs.Breadth) { status = true; } return status; } // nạp chồng phép so sánh khác public static bool operator !=(Box lhs, Box rhs) { bool status = false; if (lhs.Length != rhs.Length || lhs.Height != rhs.Height || lhs.Breadth != rhs.Breadth) { status = true; } return status; } // nạp chồng phép so sánh nhỏ hơn public static bool operator <(Box lhs, Box rhs) { bool status = false; if (lhs.Length < rhs.Length && lhs.Height < rhs.Height && lhs.Breadth < rhs.Breadth) { status = true; } return status; } // nạp chồng phép so sánh lớn hơn public static bool operator >(Box lhs, Box rhs) { bool status = false; if (lhs.Length > rhs.Length && lhs.Height > rhs.Height && lhs.Breadth > rhs.Breadth) { status = true; } return status; } public override string ToString() { return string.Format("({0}, {1}, {2})", Length, Breadth, Height); } } internal class Program { private static void Main(string[] args) { Box Box1 = new Box(6, 7, 5); Box Box2 = new Box(12, 13, 10); Box Box3 = new Box(); Box Box4 = new Box(); /* phép cộng hai hình hộp cho ra hình hộp khác có kích thước * bằng tổng kích thước của hai hộp */ Box3 = Box1 + Box2; Console.WriteLine("Box 3: {0}", Box3.ToString()); Console.WriteLine("Volume of Box3 : {0}", Box3.Volume); // so sánh hai hình hộp if (Box1 > Box2) Console.WriteLine("Box1 lớn hơn Box2"); else Console.WriteLine("Box1 không lớn hơn Box2"); if (Box3 == Box4) Console.WriteLine("Box3 bằng Box4"); else Console.WriteLine("Box3 không bằng Box4"); Console.ReadKey(); } } }

Trong ví dụ trên chúng ta đã thực hiện nạp chồng phép cộng (+), phép so sánh (bằng ==, khác. =, lớn hơn >, nhỏ hơn command;
Từ C# 7 có thể sử dụng phần thân biểu thức cho cả phương thức nhận và đặt thuộc tính

Bây giờ bạn có thể truy xuất từng chiều của vector như sau

static void Main(string[] args) { var vector1 = new Vector(1, 2, 3); WriteLine($"vector 1: {vector1}"); var x = vector1[0]; var y = vector1[1]; var z = vector1[2]; WriteLine($"Vector components: x = {x}, y = {y}, z = {z}"); vector1[2] = 30; vector1[1] = 20; vector1[0] = 10; WriteLine($"vector 1: {vector1}"); ReadLine(); }

Dưới đây là mã đầy đủ của ví dụ trên

public static Box operator +(Box b, Box c) {...} public static bool operator ==(Box lhs, Box rhs) {...} public static bool operator !=(Box lhs, Box rhs) {...} public static bool operator <(Box lhs, Box rhs) {...} public static bool operator >(Box lhs, Box rhs) {...} 0

Kết luận

Bài học này đã hướng dẫn các bạn làm quen với việc nạp chồng toán tử cho lớp trong C#. Bạn có thể thấy, thực hiện nạp chồng toán tử trong C# rất đơn giản

Chủ đề