我所经历的大多数网站,文章通过给出了解释运营商的重载 遵循标准示例。
class Complex
{
int real;
int imaginary;
public Complex(int real, int imaginary)
{
this.real = real;
this.imaginary = imaginary;
}
public static Complex operator +(Complex com1, Complex com2)
{
return new Complex(com1.real + com2.real,
com1.imaginary + com2.imaginary);
}
public override string ToString()
{
return (String.Format("{0} + {1}i", real, imaginary));
}
}
}
我们初学者认为,运算符重载对于科学应用非常有用。
运营商超载是否对电子商务,电子银行或其他应用程序非常有用? 正如我们看到上面给出的标准示例,很难掌握运算符的实际功能 重载。请你通过提供必要的例子来解释它。
答案 0 :(得分:2)
在您提到的应用程序中,加法和减法(以及其他所需的数学运算)是常用的标准化操作,因此不需要重载。
对于所有其他操作,我更喜欢使用方法。
科学示例对于运算符重载非常有用,因为它根据系统未知的数据类型重新定义了数学运算。如果您想创建一个自定义对象,该对象在语义上可以被另一个自定义对象实例添加或减去,那么运算符重载可能是合适的。
但建议谨慎。过载必须对其他程序员有概念意义。为了提供一个简单荒谬的例子,将加法定义为减法是完全可行的(但根本不可接受)。
答案 1 :(得分:1)
只是运算符从.NET Framework重载的示例
Console.WriteLine(DateTime.Now + TimeSpan.FromDays(1));
正如你所看到的,它不是“科学的”。 我们这样说吧。如果您使用数据结构进行操作,那么通常需要了解减法,加法或逻辑运算应该做什么,那么请使用运算符重载。如果您发明自己的结构和规则,最好使用方法。规则是,重载运算符的使用应该让您感觉非常自然,而不仅仅是其他开发人员阅读您的代码。
答案 2 :(得分:1)
好的,这是一个例子。我有一个应用程序,其中许多域对象包含一个指定“日历月”的属性,其中该月的特定日期是相关的。 (1998年12月,2003年3月等)
所以,我创建了一个结构,在内部将这些值表示为一个原始整数,(我认为自2000年1月以来的月数)。此结构包括许多方法,用于从各种输入类型(DateTimes,可以转换为日期时间的字符串或一年中的日期时间等)来实例化此CalendarMonth结构的实例。该结构具有CalendarMonth Parse(string inputValue)
和{{{ 1}}方法,因为在这个应用程序中使用了这些功能。
此结构还封装了返回第一个月,该月的最后一天,当月UTC的开始等的dateTime值的方法等。
它还有许多运算符重载,因此我可以“添加/减去”一个日历月的时间段并获取CalendarMonth,或者减去两个CalendarMonth结构以获得TimeSpan ...有点像日期时间。它还具有隐式和显式转换运算符重叠,以在日期时间和CalendarMonth结构之间来回转换...
我会说,一般来说,只要你的域中有一个类型可以被称为值类型(因为它没有“身份”,但它只是通过它的属性值定义,这种技术很有用,并且在您的应用程序所在的问题域中具有 定量 行为质量。
答案 3 :(得分:0)
答案 4 :(得分:0)
如果您能以任何方式提供帮助,请不要滥用运算符重载。问题在于代码可读性 - 当你看到它时很容易混淆:
CustomerCart cart = new CustomerCart();
IList<Purchases> purchases = this.GetPurchases();
以及稍后的代码:
bool success = cart + purchases;
这肯定会让我做一个双重考虑。使用更多“原始”类型(例如Complex
),您可以避免这种情况,但通常使用高级类型,以避免操作重载,因为它会混淆代码。