#C کلید ورود به بازار کار

دوره پروژه‌محور #C و ASP.NET Core

C#
C#
مقالات برنامه نویسی
آموزش Overload کردن عملگرها در سی شارپ

دوره آموزش برنامه نویسی C#

کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.

آموزش Overload کردن عملگرها در سی شارپ

شما می توانید اکثر اپراتورهای موجود و داخلی در C# را دوباره تعریف یا overload کنید. بنابراین برنامه نویس می تواند از اپراتورهایی با نوع تعریف شده توسط کاربر نیز استفاده کند . اپراتورهای overload شده عملکردهایی هستند با نام های خاص که کلمه ی کلیدی operator با نمادی برای اپراتور تعریف شده دنبال می شود. مانند هر عملکرد دیگری یک اپراتور overload شده دارای یک نوع بازگشتی و یک لیست پارامتر می باشد.

 برای مثال به عملکرد زیر دقت کنید.

public static Box operator+ (Box b, Box c)‎
        ‎{‎
        ‎   Box box =
new Box();‎
        ‎   box.length = b.length + c.length;‎
        ‎   box.breadth = b.breadth + c.breadth;‎
        ‎   box.height = b.height + c.height;‎
        ‎  
return
box;‎
        ‎}
‎

عملکرد بالا اپراتور جمع (+) را برای یک گروه Box تعریف شده توسط یوزر، اجرا می کند.

 اجرای overload کردن اپراتور

برنامه ی زیر اجرای کامل را نشان می دهد.

using System;‎
        namespace OperatorOvlApplication
        ‎{‎
        ‎  
class Box
‎   {‎
        ‎     
private double length;      // Length of a box‎
       
‎      private double breadth;     // Breadth of a box‎
       
‎      private double height;      // Height of a box‎
       
‎      public double getVolume()‎
        ‎      {‎
        ‎        
return length * breadth * height;‎
        ‎      }‎
        ‎     
public void setLength( double len )‎
        ‎      {‎
        ‎         length = len;‎
        ‎      }‎
        ‎     
public void setBreadth( double bre )‎
        ‎      {‎
        ‎         breadth = bre;‎
        ‎      }‎
        ‎     
public void setHeight( double hei )‎
        ‎      {‎
        ‎         height = hei;‎
        ‎      }‎
        ‎     
// Overload + operator to add two Box objects.‎
       
‎      public static Box operator+ (Box b, Box c)‎
        ‎      {‎
        ‎         Box box =
new Box();‎
        ‎         box.length = b.length + c.length;‎
        ‎         box.breadth = b.breadth + c.breadth;‎
        ‎         box.height = b.height + c.height;‎
        ‎        
return box;‎
        ‎      }‎
        ‎   }‎
        ‎  
class Tester
‎   {‎
        ‎     
static void Main(string[] args)‎
        ‎      {‎
        ‎         Box Box1 =
new Box();         // Declare Box1 of type Box‎
       
‎         Box Box2 = new Box();         // Declare Box2 of type Box‎
       
‎         Box Box3 = new Box();         // Declare Box3 of type Box‎
       
‎         double volume = 0.0;          // Store the volume of a box here‎
       
‎         // box 1 specification‎
       
‎         Box1.setLength(6.0);‎
        ‎         Box1.setBreadth(
7.0);‎
        ‎         Box1.setHeight(
5.0);‎
        ‎        
// box 2 specification‎
       
‎         Box2.setLength(12.0);‎
        ‎         Box2.setBreadth(
13.0);‎
        ‎         Box2.setHeight(
10.0);‎
        ‎        
// volume of box 1‎
       
‎         volume = Box1.getVolume();‎
        ‎         Console.WriteLine(
"Volume of Box1 : {0}", volume);‎
        ‎        
// volume of box 2‎
       
‎         volume = Box2.getVolume();‎
        ‎         Console.WriteLine(
"Volume of Box2 : {0}", volume);‎
        ‎        
// Add two object as follows:‎
       
‎         Box3 = Box1 + Box2;‎
        ‎        
// volume of box 3‎
       
‎         volume = Box3.getVolume();‎
        ‎         Console.WriteLine(
"Volume of Box3 : {0}"
, volume);‎
        ‎         Console.ReadKey();‎
        ‎      }‎
        ‎   }‎
        ‎}
‎

 وقتی که برنامه ی بالا کامپایل شده و اجرا می شود، نتایج زیر را به دنبال دارد.

Volume of Box1 : 210‎
        Volume of Box2 : 1560‎
        Volume of Box3 : 5400‎
 

اپراتورهای قابل overload شدن و اپراتورهای غیرقابل overload شدن

 جدول زیر توانایی overload شدن اپراتورها را در C# توضیح می دهد.

Operators

Description

+, -, !, ~, ++, --

این عملگرهای یکانی یک عملوند می گیرند و می توانند overload شوند.

+, -, *, /, %

این عملگرهای دودویی یک عملوند می گیرند و می توانند overload شوند.

==, !=, <, >, <=, >=

این عملگر های مقایسه ای می توانند overload شوند.

&&, ||

عملگر های منطقی شرطی نمی توانند به طور مستقیم overload شوند.

+=, -=, *=, /=, %=

عملگرهای تخصیص نمی توانند overload شوند.

=, ., ?:, ->, new, is, sizeof, typeof

این عملگرهای نمی توانند overload شوند.

 

مثال

در ارتباط با مباحث قبلی اجازه دهید مثال قبل را گسترش داده و اپراتورهای بیشتری را overload کنیم.

using System;‎
        namespace OperatorOvlApplication
        ‎{‎
        ‎   
class Box
‎    {‎
        ‎      
private double length;      // Length of a box‎
       
‎       private double breadth;     // Breadth of a box‎
       
‎       private double height;      // Height of a box‎
       
‎       public double getVolume()‎
        ‎       {‎
        ‎        
return length * breadth * height;‎
        ‎       }‎
        ‎     
public void setLength( double len )‎
        ‎      {‎
        ‎          length = len;‎
        ‎      }‎
        ‎     
public void setBreadth( double bre )‎
        ‎      {‎
        ‎          breadth = bre;‎
        ‎      }‎
        ‎     
public void setHeight( double hei )‎
        ‎      {‎
        ‎          height = hei;‎
        ‎      }‎
        ‎     
// Overload + operator to add two Box objects.‎
       
‎      public static Box operator+ (Box b, Box c)‎
        ‎      {‎
        ‎          Box box =
new Box();‎
        ‎          box.length = b.length + c.length;‎
        ‎          box.breadth = b.breadth + c.breadth;‎
        ‎          box.height = b.height + c.height;‎
        ‎         
return box;‎
        ‎      }‎
        ‎     
public static bool operator == (Box lhs, Box rhs)‎
        ‎      {‎
        ‎          bool status =
false;‎
        ‎         
if (lhs.length == rhs.length && lhs.height == rhs.height
        ‎             && lhs.breadth == rhs.breadth)‎
        ‎          {‎
        ‎              status =
true;‎
        ‎          }‎
        ‎         
return status;‎
        ‎      }‎
        ‎     
public static bool operator !=(Box lhs, Box rhs)‎
        ‎      {‎
        ‎          bool status =
false;‎
        ‎         
if (lhs.length != rhs.length || lhs.height != rhs.height‎
        ‎              || lhs.breadth != rhs.breadth)‎
        ‎          {‎
        ‎              status =
true;‎
        ‎          }‎
        ‎         
return status;‎
        ‎      }‎
        ‎     
public static bool operator <(Box lhs, Box rhs)‎
        ‎      {‎
        ‎          bool status =
false;‎
        ‎         
if (lhs.length < rhs.length && lhs.height‎
        ‎              <
rhs.height && lhs.breadth < rhs.breadth)‎
        ‎          {‎
        ‎              status =
true;‎
        ‎          }‎
        ‎         
return status;‎
        ‎      }‎
        ‎     
public static bool operator >(Box lhs, Box rhs)‎
        ‎      {‎
        ‎          bool status =
false;‎
        ‎         
if (lhs.length > rhs.length && lhs.height‎
        ‎              > rhs.height && lhs.breadth > rhs.breadth)‎
        ‎          {‎
        ‎              status =
true;‎
        ‎          }‎
        ‎         
return status;‎
        ‎      }‎
        ‎     
public static bool operator <=(Box lhs, Box rhs)‎
        ‎      {‎
        ‎          bool status =
false;‎
        ‎         
if (lhs.length <= rhs.length && lhs.height‎
        ‎              <= rhs.height && lhs.breadth <= rhs.breadth)‎
        ‎          {‎
        ‎              status =
true;‎
        ‎          }‎
        ‎         
return status;‎
        ‎      }‎
        ‎     
public static bool operator >=(Box lhs, Box rhs)‎
        ‎      {‎
        ‎          bool status =
false;‎
        ‎         
if (lhs.length >= rhs.length && lhs.height‎
        ‎             >= rhs.height && lhs.breadth >= rhs.breadth)‎
        ‎          {‎
        ‎              status =
true;‎
        ‎          }‎
        ‎         
return status;‎
        ‎     }‎
        ‎     
public override string ToString()‎
        ‎      {‎
        ‎         
return String.Format("({0}, {1}, {2})", length, breadth, height);‎
        ‎      }‎
        ‎   }‎
        ‎  
class Tester
‎   {‎
        ‎     
static void Main(string[] args)‎
        ‎      {‎
        ‎        Box Box1 =
new Box();          // Declare Box1 of type Box‎
       
‎        Box Box2 = new Box();          // Declare Box2 of type Box‎
       
‎        Box Box3 = new Box();          // Declare Box3 of type Box‎
       
‎        Box Box4 = new Box();‎
        ‎       
double volume = 0.0;   // Store the volume of a box here‎
       
‎        // box 1 specification‎
       
‎        Box1.setLength(6.0);‎
        ‎        Box1.setBreadth(
7.0);‎
        ‎        Box1.setHeight(
5.0);‎
        ‎       
// box 2 specification‎
       
‎        Box2.setLength(12.0);‎
        ‎        Box2.setBreadth(
13.0);‎
        ‎        Box2.setHeight(
10.0);‎
        ‎     
//displaying the Boxes using the overloaded ToString():‎
       
‎        Console.WriteLine("Box 1: {0}", Box1.ToString());‎
        ‎        Console.WriteLine(
"Box 2: {0}", Box2.ToString());‎
        ‎       
// volume of box 1‎
       
‎        volume = Box1.getVolume();‎
        ‎        Console.WriteLine(
"Volume of Box1 : {0}", volume);‎
        ‎      
// volume of box 2‎
       
‎        volume = Box2.getVolume();‎
        ‎        Console.WriteLine(
"Volume of Box2 : {0}", volume);‎
        ‎      
// Add two object as follows:‎
       
‎        Box3 = Box1 + Box2;‎
        ‎        Console.WriteLine(
"Box 3: {0}", Box3.ToString());‎
        ‎       
// volume of box 3‎
       
‎        volume = Box3.getVolume();‎
        ‎        Console.WriteLine(
"Volume of Box3 : {0}", volume);‎
        ‎       
//comparing the boxes‎
       
‎        if (Box1 > Box2)‎
        ‎          Console.WriteLine(
"Box1 is greater than Box2");‎
        ‎       
else
       
‎          Console.WriteLine("Box1 is  greater than Box2");‎
        ‎       
if (Box1 < Box2)‎
        ‎          Console.WriteLine(
"Box1 is less than Box2");‎
        ‎        
else
       
‎          Console.WriteLine("Box1 is not less than Box2");‎
        ‎       
if (Box1 >= Box2)‎
        ‎          Console.WriteLine(
"Box1 is greater or equal to Box2");‎
        ‎       
else
       
‎          Console.WriteLine("Box1 is not greater or equal to Box2");‎
        ‎       
if (Box1 <= Box2)‎
        ‎          Console.WriteLine(
"Box1 is less or equal to Box2");‎
        ‎       
else
       
‎          Console.WriteLine("Box1 is not less or equal to Box2");‎
        ‎       
if (Box1 != Box2)‎
        ‎          Console.WriteLine(
"Box1 is not equal to Box2");‎
        ‎       
else
       
‎          Console.WriteLine("Box1 is not greater or equal to Box2");‎
        ‎        Box4 = Box3;‎
        ‎       
if (Box3 == Box4)‎
        ‎          Console.WriteLine(
"Box3 is equal to Box4");‎
        ‎       
else
       
‎          Console.WriteLine("Box3 is not equal to Box4"
);‎
        ‎        Console.ReadKey();‎
        ‎      }‎
        ‎    }‎
        ‎}
‎

 وقتی که برنامه ی بالا کامپایل شده و اجرا می شود، نتایج زیر را به دنبال دارد.

Box 1: (6, 7, 5)‎
        Box
2: (12, 13, 10)‎
        Volume of Box1 :
210‎
        Volume of Box2 : 1560‎
        Box 3: (18, 20, 15)‎
        Volume of Box3 :
5400‎
        Box1 is not greater than Box2‎
        Box1 is less than Box2‎
        Box1 is not greater or equal to Box2‎
        Box1 is less or equal to Box2‎
        Box1 is not equal to Box2‎
        Box3 is equal to Box4
‎
مقاله قبلی
آموزش چند ریختی در سی شارپ
مقاله بعدی
اموزش Interfaces در سی شارپ
نظرات شما

نظرات خود را ثبت کنید...