问题问的蛮好。 个人认为,尽量不使用运算符重载。 因为操作符重载不当会导致结果错误,虽然不是异常。但很要命的。当然你可以说人为的避免,希望可以避免吧。 演示一个操作重载带来的不同表现:static void Main(string[] args) { B obj1 = new B(1); B obj2 = new B(2); B result2 = obj1 + obj2;//B类型的+ A result = (A)obj1 + (A)obj2;//调用A类型的+ Console.WriteLine("+ by B cast : " + result2.ToString()); Console.WriteLine("+ by (A) cast : " + result.ToString()); Console.ReadKey(); }public class A { public int Value { get; set; } public A(int v) { Value = v; } public static A operator +(A obj1, A obj2) { return new A(obj1.Value + obj2.Value); } public override string ToString() { return Value.ToString(); } }public class B : A { public B(int v) : base(v) { } public static B operator +(B obj1, B obj2) { return new B(obj1.Value * obj2.Value); } } 如果你对子类和父类的某一个操作符定义了不同的实现,那这个不会如你期望的面向对象,而是根据你转换类型而定的,你转换为父类,则调用父类的方法。可能还不明白,看到帖子的人会问,那我怎么会那么蠢,这么干呢?你会不小心的。面向对象的开发思路下,我们可能习惯了用基类操作,使用接口或基类,可以编写不基于实现的,具有扩展性的程序,那如果不同的子类重新的实现了操作重载,你用一个基类的引用指向这个对象的时候,将不会执行子类的操作符重载,这和开发的预期是不同的。这样的问题可能很隐晦,如果项目中出现了,我想要准确找到此类问题会非常有难度。所以,个人认为,尽可能不使用操作符重载。当然,不是绝对的。
个人认为,尽量不使用运算符重载。
因为操作符重载不当会导致结果错误,虽然不是异常。但很要命的。当然你可以说人为的避免,希望可以避免吧。
演示一个操作重载带来的不同表现:static void Main(string[] args)
{
B obj1 = new B(1);
B obj2 = new B(2);
B result2 = obj1 + obj2;//B类型的+
A result = (A)obj1 + (A)obj2;//调用A类型的+
Console.WriteLine("+ by B cast : " + result2.ToString());
Console.WriteLine("+ by (A) cast : " + result.ToString());
Console.ReadKey();
}public class A
{
public int Value { get; set; }
public A(int v)
{
Value = v;
}
public static A operator +(A obj1, A obj2)
{
return new A(obj1.Value + obj2.Value);
}
public override string ToString()
{
return Value.ToString();
}
}public class B : A
{
public B(int v) : base(v) { }
public static B operator +(B obj1, B obj2)
{
return new B(obj1.Value * obj2.Value);
}
}
如果你对子类和父类的某一个操作符定义了不同的实现,那这个不会如你期望的面向对象,而是根据你转换类型而定的,你转换为父类,则调用父类的方法。可能还不明白,看到帖子的人会问,那我怎么会那么蠢,这么干呢?你会不小心的。面向对象的开发思路下,我们可能习惯了用基类操作,使用接口或基类,可以编写不基于实现的,具有扩展性的程序,那如果不同的子类重新的实现了操作重载,你用一个基类的引用指向这个对象的时候,将不会执行子类的操作符重载,这和开发的预期是不同的。这样的问题可能很隐晦,如果项目中出现了,我想要准确找到此类问题会非常有难度。所以,个人认为,尽可能不使用操作符重载。当然,不是绝对的。