下面的例子演示了如何使用C#的运算符重载:
using System;
namespace Com.LoonStudio.Example {
/// <summary>
/// 平面上的点
/// </summary>
public class Point {
public double X { set; get; } // 横坐标
public double Y { set; get; } // 纵坐标
public Point(double x, double y) {
X = x;
Y = y;
}
/// <summary>
/// 将*定义为计算两点间距离的运算符
/// </summary>
/// <param name="p1">点1</param>
/// <param name="p2">点2</param>
/// <returns>两点间的距离</returns>
public static double operator *(Point p1, Point p2) {
double dx = p1.X - p2.X;
double dy = p1.Y - p2.Y;
return Math.Sqrt(dx * dx + dy * dy);
}
}
public class Line {
public Point Start { set; get; } // 起点
public Point End { set; get; } // 终点
public Line(Point start, Point end) {
Start = start;
End = end;
}
/// <summary>
/// 将|运算符定义为判断两条线段是否平行的运算符
/// </summary>
/// <param name="line1">线段1</param>
/// <param name="line2">线段2</param>
/// <returns>平行返回true,不平行返回false</returns>
public static bool operator |(Line line1, Line line2) {
double slope1 = line1.End.Y - line1.Start.Y / line1.End.X - line1.Start.X;
double slope2 = line2.End.Y - line2.Start.Y / line2.End.X - line2.Start.X;
return slope1 == slope2;
}
/// <summary>
/// 线段的长度(通过*运算符计算起点和终点的距离)
/// </summary>
public double Length {
get { return Start * End; }
}
}
class Program {
static void Main(string[] args) {
Point p1 = new Point(1, 3);
Point p2 = new Point(4, 6);
Console.WriteLine("{0:F2}", p1 * p2);
Line line1 = new Line(p1, p2);
Line line2 = new Line(new Point(3, 5), new Point(12, 6));
Console.WriteLine(line1 | line2 ? "平行" : "不平行");
}
}
}
注意:在进行运算符重载的时候最好保持运算符原有的含义,还有就是记得并非所有的运算符都可以重载,都需要重载。