Unary : به معنی یکانی است ؛ یعنی در محاسبه فقط یک عضو دخیل است، برای مثال عملگر! که مقدار یک متغیر از نوع Boolean را بر عکس میکند، اگر true باشد آن را false میکند و اگر false باشد true میکند.
Binary : به معنی دو دویی است. در این عملگرها دو عملوند درگیر هستند، به طور مثال 2 عدد با هم جمع یا از هم کم میشوند.
بسیار خب حالا میخواهیم تمامی این عملگرها را برای کلاسی که خودمان نوشتهایم بازنویسی کنیم. باید توجه داشته باشید که تمامی این عملگرها قابل بازنویسی نبوده و فقط آنهایی را میتوانید بازنویسی کنید که به صورت زیر تعریف شود.
از عملگرهای unary :
+ - ! ~ ++ -- true false
از عملگرهای binary:
+ - * / % & | &~#@& «« »» == != » « »= «=
در شماره پیش در مورد بازنویسی و این که چگونه باید این کار را انجام دهیم توضیحاتی داده شده است، برای یادآوری به کد زیر دقت کنید:
class Matrix {
public const int DimSize = 3;
private double[,] m_matrix = new double[DimSize, DimSize]; {
get { return m_matrix[x, y]; }
set { m_matrix[x, y] = value; } }
public static Matrix operator +(Matrix mat1, Matrix mat2) {
Matrix newMatrix = new Matrix();
for (int x=0; x « DimSize; x++)
for (int y=0; y « DimSize; y++)
newMatrix[x, y] = mat1[x, y] + mat2[x, y];
return newMatrix; } }
در کد بالا عملگر + را برای کلاس matrix بازنویسی کردیم که درنتیجه آن شما میتوانید به صورت زیر 2 ماتریس را با هم جمع کنید:
Matrix mat1 = new Matrix();
Matrix mat2 = new Matrix();
Matrix mat3 = mat1 + mat2;
برای باقی عملگرها نیز شما میتوانید به همین منوال عمل کنید، فقط باید در نظر داشته باشید که این عملگری که برای کلاس خود بازنویسی کردید چه ورودی و خروجی دارد.
در شمارههای قبل درباره انواع داده و تبدیل آنها و چگونگی تبدیل (Casting) صحبت کردیم، در این شماره قصد داریم به کلاس خودمان این امکان را بدهیم تا بتواند به انواع داده دیگر تبدیل شود یا بتوان براحتی انواع دیگر را به آن تبدیل کرد.
قبل از شروع با 2 کلید واژه در سی شارپ آشنا میشویم:
Implicit : به معنی ضمنی است؛ یعنی شما به اعلام نوع کار خود نیاز ندارید.
Explicit : به معنی صراحت بوده، یعنی شما باید بهطور شفاف اعلام کنید چه کاری قرار است انجام دهید.
این دو کلید واژه در سی شارپ 2 کاربرد دارد؛ یکی در رابط ها یکی هم در تبدیل نوع داده. از آنجا که بحث ما درباره تبدیل داده است ، آن را در تبدیل داده بررسی میکنیم.
به 2 کد زیر دقت کنید :
MyClass obj = 10;
MyClass obj2 = (MyClass)10;
در هر دو خط ما قصد داریم عدد ۱۰ را به یک شیء از کلاس MyClass تبدیل کنیم. در خط اول به صورت ضمنی این کار را انجام دادهایم ، در خط دوم بصراحت این کار را انجام میدهیم.
اما کدی که در کلاس باید نوشته شده باشد به چه صورت است ؟
class MyClass{
public int x;
public static implicit operator MyClass(int x){
return new MyClass(x);
}
public static explicit operator MyClass(int x){
return new MyClass(x);
}
}
همانگونه که در کد بالا مشاهده میکنید، ما به 2 صورت implicit و explicit یک عدد صحیح از نوع int را به یک شیء از کلاس خودمان تعریف میکنیم.
به عنوان تمرین همان کلاس ماتریسی را که در بالا بخشی از کد آن نوشته شد کامل کنید و این امکان را به تبدیلهای خود بدهید تا بتوانید یک آرایه از اعداد صحیح را به یک ماتریس تبدیل کنید و همینطور برعکس.
منابع :
1- http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx
2- http://www.codeproject.com/Articles/93160/Operator-Overloading-with-Implicit-and-Explicit-Ca
3- http://www.csharp-station.com/Tutorials/Lesson18.aspx
امیربهاءالدین سبطالشیخ