بازنويسي عملگرها در سي شارپ - Operator Overloading in csharp
تمامي عملگرها (operators) در سي شارپ داراي رفتار هاي از پيش تعيين شده اي هستند و شما مي توانيد از اين عملگرها در عبارت هاي خود استفاده کنين:
int i = 10;
int j = 20;
int m = i * j / 2 + 14;
Console.WriteLine("m is :{0}",m);
اما اگر شما عبارت زير را بنويسيد چطور؟
Person p = new Person("Ali",20);
Person p2 = new Person("Reza",30);
Person p3 = p + p2;
Console.WriteLine("Name: {0}, Age:{1}",p3.Name , p3.Age);
در صورتيکه اين کد را Compile کنين متوجه يک خطاي Compile Time خواهيد شد که به شما توضيح مي دهد که امکان جمع بستن دو Person با يکديگر وجود ندارد يا به عبارت ديگر عملگر + براي Person تعريف نشده است.
در سي شارپ شما مي توانين بسياري از عملگرها را دوباره نويسي کنين به عبارت ديگر شما مي توانين در مواقع لزوم تعريف جديد از يک عملگر در سي شارپ داشته باشيم. در تصوير زير ليست عملگرها به همراه توضيحاتي راجع به امکان بازنويسي شان مي بينيد.
همانطور که در تصوير مشخص است شما نمي توانين تمام عملگرها را دوباره نويسي کنين.
در سي شارپ يک کلمه کليدي به نام operator وجود دارد که براي بازنويسي عملگرها بايد از آن استفاده کنيم. به عنوان مثال براي اينکه مثالي که در ابتدا نوشتيم درست عمل کند و وقتي عبارت بالا را اجرا مي کنيم يک شيء جديد از جنس Person ايجاد شود که نامش از جمع بستن نام اين دو فرد و سنش از جمع بستن سن اين دو فرد تشکيل شود من در کلاس Person اين کد را مي نويسم:
public static Person operator +(Person p1, Person p2)
{
Person p = new Person();
p.Name = p1.Name + " " + p2.Name;
p.Age = p1.Age + p2.Age;
return p;
}
دقت بفرمائيد که حاصل جمع دو شيء از جنس Person يک Person مي باشد و من در پياده سازي عملگر + يک فرد جديد ساخته ام. اما اگر بخواهيم عملگر == يا همان برابري را دوباره نويسي کنيم بايد دقت کنيم که خروجي آن بايد يک عبارت true /false و از جنس bool باشد. در نتيجه اگر من بخواهم که مبناي مقايسه دو شيء از جنس Person را براساس نامشان قرار دهم از اين کد استفاده مي کنم:
public static bool operator ==(Person p1, Person p2)
{
return p1.Name == p2.Name;
}
نکته مهم در اين مثال اين است که شما وقتي عملگر == (برابري) را دوباره نويسي مي کنين
بايد عملگر
!= (نابرابري) را هم دوباره نويسي کنين:
public static bool operator !=(Person p1, Person p2)
{
return !p1==p2;
}
بارگزاري مثال