返回 登录
0

C#中如何利用操作符重载

图片描述

多态性是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

评论