多态性是OOP(面向对象编程)的基本原则之一。多态性(Polymorphism)来源于两个词——“poly”意为很多,“morph”意为形式。因此,多态性意味着同样的事情以不同的形式存在。
操作符重载是静态多态性的一个示例。可以利用操作符重载或增加操作符功能,使用基本数据类型相同的用户定义类型方法进行操作。
什么是操作符?什么是能被重载的操作符?
表达式中通常有操作符和操作数。操作符对操作数起作用并且是表达式中的一部分。举例说明,下面是一个表达式,包含两个操作数和一个操作符。操作数是X和Y,操作符是+。
X+Y
操作符被分为一元、二元、比较、赋值等,取决于它们的目的和操作符运算操作数。虽然大多数的操作符可被重载,但仍有一些限制。本质上来说,并不是所有的操作符都能被重载。
一元运算符,只有一个操作数的运算符被重载。也可以重载二元操作符或者比较操作符,如“==”、”!=”、”<”、”>”、“<=”和“>=”。不能重载“=”、“?”、“->”、“new”、“is”、”sizeof”和”typeof”操作符。也不能重载条件操作符如&&和||。另外,数组索引操作符“[]”也不能被重载。
查看更多的可被重载的操作符 。
C#中实现操作符重载
本节中将探讨如何在C#中实现操作符重载。考虑下面DistanceCalculator类。
public class DistanceCalculator { Int32 feet = 0, inch = 0; public DistanceCalculator(Int32 feet = 0, Int32 inch = 0) { this.feet = feet; this.inch = inch; } }
阅读上述代码。DistanceCalculator类包含两个Int32数据成员,即feet和inch。现在我们将在类中添加更多的方法来说明操作符如何被重载。
使用操作符重载时,需要记住几点。第一点,操作符重载应该有相对应的方法,如使用关键字符标记。第二点,运算符函数的参数是操作数和运算符函数的返回值。最后,运算符函数应该是静态的且是包含类型的一个成员。
下面的代码片段说明了一个典型的运算符函数功能。该示例展示了“==”和“!=”操作符能够被重载。
public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2) { return obj1.Value == obj2.Value; } public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2) { return obj1.Value != obj2.Value; }
注意:值是一个属性且返回值是inch。
public Int32 Value { get { return (feet * 12) + inch; } }
以下是完整的DistanceCalculator类代码。
public class DistanceCalculator { Int32 feet = 0, inch = 0; public DistanceCalculator(Int32 feet = 0, Int32 inch = 0) { this.feet = feet; this.inch = inch; } public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2) { return obj1.Value == obj2.Value; } public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2) { return obj1.Value != obj2.Value; } public override bool Equals(object obj) { DistanceCalculator distanceCalculator = obj as DistanceCalculator; if (distanceCalculator != null) { return (distanceCalculator == this); } return false; } public override int GetHashCode() { return Value.GetHashCode(); } public Int32 Feet { get { return feet; } } public Int32 Inch { get { return inch; } } public Int32 Value { get { return (feet * 12) + inch; } } }
下面代码片段说明如何使用DistanceCalculator类。
static void Main(string[] args) { DistanceCalculator obj1 = new DistanceCalculator(1, 2); DistanceCalculator obj2 = new DistanceCalculator(1, 2); Console.WriteLine((obj1 == obj2).ToString()); Console.Read(); }
下面代码片段说明如何重载“+”操作符来添加两个对象。
public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2) { Int32 totalInches = obj1.Value + obj2.Value; Int32 feet = totalInches / 12; Int32 inch = totalInches % 12; DistanceCalculator temp = new DistanceCalculator(feet, inch); return temp; }
在DistanceCalculator类中添加两个属性。下面代码片段显示如何添加两个DistanceCalculator类型的对象并返回结果,即返回对象是DistanceCalculator类型。
public Int32 Feet { get { return feet; } } public Int32 Inch { get { return inch; } }
以下是如何创建两个DistanceCalculator类的实例,利用重载操作符函数分配结果到另一个相同类型对象中。
static void Main(string[] args) { DistanceCalculator obj1 = new DistanceCalculator(1, 11); DistanceCalculator obj2 = new DistanceCalculator(1, 2); DistanceCalculator obj3 = obj1 + obj2; Console.WriteLine("Feet: "+obj3.Feet.ToString()); Console.WriteLine("Inch: " + obj3.Inch.ToString()); Console.Read(); }
英文来源: How to work with operator overloading in C#
作者:Joydip Kanjilal
译者:屠敏,欢迎技术投稿、约稿,给文章纠错,请发送邮件tumin@csdn.net。