//结构体Vector用于处理三位矢量运算
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 v)
{
x = v.x;
y = v.y;
z = v.z;
}
public override string ToString()
{
return "(" + x + "." + "" + y + "." + "" + z + ")";
}
/* 一,相加的重载
* ① 大体与方法的声明相近,operator修饰符告诉编译器这是一个运算符的重载
* ② 两个参数对于二元运算符来说,第一个是放在左边的值,第二个是右边的
* ③ C#要求所有的运算符重载都声明为public和static,
* 这是为了表示运算符的重载与他们类或者结构相关联,而不是与实例相关联。
* ④ 如果我们重载的+运算符,编译器会自动执行+=运算符的重载,实际上是一个先相加再赋值的过程
*/
public static Vector operator +(Vector lhs, Vector rhs)
{
//结果返回用Vector
Vector result = new Vector(lhs);
result.x += rhs.x;
result.y += rhs.y;
result.z += rhs.z;
return result;
}
/* 二,更多的重载
* 下面的相乘的重载只能处理 double * Vector的代码
* 而对于Vector * double的代码却不能编译,我们需要自己来提供想方法的重载一样的方式
*/
public static Vector operator *(double lhs, Vector rhs)
{
return new Vector(lhs * rhs.x, lhs * rhs.y, lhs * rhs.z);
}
//对于Vector * double的代码我们可以像上类那样在写一次,也可以向下面这样,执行翻转顺序操作
//这样就可以调用既存的重载方法,便于代码维护
public static Vector operator *(Vector lhs, double rhs)
{
return rhs * lhs;
}
/* 三,比较运算符的重载
* ① C#要求成对重载比较运算符,如果重载了 == 就必须重载 !=
* ② 比较运算符的重载必须返回bool型的值
* ③ 重载 == 和 !=最好重载Euals和GetHashCode()方法,因为它们执行相同逻辑(参考C#==>相等)
* */
public static bool operator ==(Vector lhs, Vector rhs)
{
if (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z)
{
return true;
}
else
{
return false;
}
}
public static bool operator !=(Vector lhs, Vector rhs)
{
return !(lhs == rhs);
}
//※我们重写了== 和 !=但没有重写Euals和GetHashCode方法,实际执行中编译器会有一个警告
}