通过重载C#的操作符来改变类的行为

ZDNet软件频道 时间:2002-11-01 作者:BUILDER.COM |  我要评论()
本文关键词:
C#操作符重载使之更容易保持同C++应用程序的向后兼容性,但除此以外,在C#应用程序中使用操作符重载能给你带来更多的好处。

C#提供了用你自己创建的行为来替代算术运算、比较和逻辑操作符缺省的行为。这样提供了向后兼容性,有一天你可能想把C++应用程序移植到C#。尽管操作符重载在运行时容易使人迷惑,但是你能使用它灵巧的句法在你自己的应用程序中来提供定制的算术和比较操作。

在C#中,任何一元操作符(一个数的操作符,如++)和二元运算(两个数的操作符,如 ==),除了赋值操作符(=)和位操作符与(&&)和或(||)以外,其它都可以用定制的行为来重载。如果是比较操作符,你还要提供反向的重载定制。那就是说,要重载小于比较操作符(<),你同时也要重载大于比较操作符(>),父类的操作符重载能被所有子类继承,子类也能用自己的行为重载父类的操作符。

如果你想在一个类和结构使用新行为,你必须先通过定义一个新的操作符方法来声明一个操作符重载。这个新方法必须是静态的:它属于某个类型而不是属于某个类型的实例。C# 操作符方法原形采用如下形式:

public static type operator op(value_list)

在此格式中,标识符type表明使用此操作符的表达式的返回值;op是你想要重载的操作符,value_list是出现在表达式中的参数列表。这些参数将会按从左至右的顺序传递到你定制的行为中。

比较apples和oranges

我将利用此例子来讲述操作符重载:你会在列表A中发现三个类Oranges, Apples和Fruit的代码。Fruit是其它两个类的父类,在Fruit中定制操作符等于(==)和不等(!=),看看这定制的操作符(==),你会看到它带两个类型都是Fruit的参数,并且比较它们的size属性(别的你将如何比较?),如果两个参数有同样的size值就返回true。Apples和Oranges也为大于操作符和小于操作符实现了相似的定制行为。

实际上,Oranges进一步证明了父类重载的操作符能被子类继续重载。它用自己的等于操作符重载了Fruit的等于操作符,发送一个专门的信息到控制台,用之显示自己重载的等于操作符已经被调用了。

我们可以写代码来比较两个类Oranges和Apples的实例。如下所示:

Oranges o = new Oranges();
Apples a = new Apples();
o.size = 15;
a.size = 20;
//用orange和apple比较
if (o > a) {
…
}

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134