تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس الثالث والأربعون - Operator Overloading
#1
كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

في الانواع الرئيسية لنا ، نستخدم المعاملات المختلفة لتنفيذ عمليات على الفئات المشتقة منها ، فمثلاً المتغير من نوع Integer يفهم المعامل + على انه جمع ، - على انه طرح ... الخ .

ايضاً المتغيرات من نوع String تفهم المتغير + مثلاً على انه لدمج نصين ، وهكذا .

الآن لو قمنا بعمل Structure من نوع Point بالشكل التالي مثلاً :
C#:

كود :
[FONT=Tahoma]public struct Point[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]private int x, y;[/FONT]
[FONT=Tahoma]public Point(int xPos, int yPos)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]x = xPos;[/FONT]
[FONT=Tahoma]y = yPos;[/FONT]
[FONT=Tahoma]}[/FONT]
[FONT=Tahoma]}[/FONT]


vb.net:

كود :
[FONT=Tahoma]Public Structure Point [/FONT]
[FONT=Tahoma]Private x As Integer, y As Integer [/FONT]
[FONT=Tahoma]Public Sub New(ByVal xPos As Integer, ByVal yPos As [/FONT]
[FONT=Tahoma]Integer) [/FONT]
[FONT=Tahoma]x = xPos [/FONT]
[FONT=Tahoma]y = yPos [/FONT]
[FONT=Tahoma]End Sub [/FONT]
[FONT=Tahoma]End Structure[/FONT]

الآن جرب تعريف عدة نقاط ، واستخدام المعامل + او - لجمع وطرح النقاط ، ما تتوقعه ان تشاهد الناتج
عبارة عن طرح ال x في النقطة الثانية من الأولى وكذا ال y ، أو جمعهما معاً ، إلا انك في الواقع لن
تحصل سوى على رسالة خطأ تفيدك بأن structure المسمى Point لا يدعم معاملات الجمع والطرح
.
الآن سنقوم باضافة معاملات جمع وطرح إلى ال structure السابق :
C#:


كود :
[FONT=Tahoma]public struct Point[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]private int x, y;[/FONT]
[FONT=Tahoma]public Point(int xPos, int yPos)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]x = xPos;[/FONT]
[FONT=Tahoma]y = yPos;[/FONT]
[FONT=Tahoma]}[/FONT]

[FONT=Tahoma]public static Point operator + (Point p1, Point p2)[/FONT]
[FONT=Tahoma]{ return new Point(p1.x + p2.x, p1.y + p2.y); }[/FONT]
[FONT=Tahoma]public static Point operator - (Point p1, Point p2)[/FONT]
[FONT=Tahoma]{ return new Point(p1.x - p2.x, p1.y - p2.y); }[/FONT]
[FONT=Tahoma]}[/FONT]

vb.net:

كود :
[FONT=Tahoma]Public Structure Point [/FONT]
[FONT=Tahoma]Private x As Integer, y As Integer [/FONT]
[FONT=Tahoma]Public Sub New(ByVal xPos As Integer, ByVal yPos As [/FONT]
[FONT=Tahoma]Integer) [/FONT]
[FONT=Tahoma]x = xPos [/FONT]
[FONT=Tahoma]y = yPos [/FONT]
[FONT=Tahoma]End Sub [/FONT]



[FONT=Tahoma]Public Shared Operator +(ByVal p1 As Point, ByVal p2 [/FONT]
[FONT=Tahoma]As Point) As Point [/FONT]
[FONT=Tahoma]Return New Point(p1.x + p2.x, p1.y + p2.y) [/FONT]
[FONT=Tahoma]End Operator [/FONT]

[FONT=Tahoma]Public Shared Operator -(ByVal p1 As Point, ByVal p2 [/FONT]
[FONT=Tahoma]As Point) As Point [/FONT]
[FONT=Tahoma]Return New Point(p1.x - p2.x, p1.y - p2.y) [/FONT]
[FONT=Tahoma]End Operator [/FONT]
[FONT=Tahoma]End Structure [/FONT]


الآن يمكنك كتابة كود بالشكل التالي :

كود :
[FONT=Tahoma]Point p3 = p1 + p2;[/FONT]

ستحصل على النتيجة الصحيحة لعملية جمع ال Points .


ايضا يمكنك كتابة كود كالتالي مباشرة :


كود :
[FONT=Tahoma]p2-=p1;[/FONT]

آخر ما سنتعرف عليه في هذا الجزء من الدرس ، انك لن تكون قادراً سوى على تعريف Static function من اجل عمل overloading لأي معامل .

يتبع ...
}}}
تم الشكر بواسطة:
#2
ليست معاملات الجمع والطرح فقط من يمكن عمل overloading ، بل يمكنك عمل ذلك لأي نوع من المعاملات ، فمثلاً ++ و -- في السي شارب فقط :


كود :
public static Point operator ++(Point p1)
{ return new Point(p1.x+1, p1.y+1); }
public static Point operator --(Point p1)
{ return new Point(p1.x-1, p1.y-1); }
نفس الأمر بالنسبة لدوال المساواة وعمل == أو != حقيقية مثل ما تعلمنا سابقاً مع عمل overridding للدالة Equals ، سنعتمد هنا على هذه الدالة بالشكل التالي :

C#:


كود :
public override bool Equals(object o)
{
return o.ToString() == this.ToString();
}

public static bool operator ==(Point p1, Point p2)
{ return p1.Equals(p2); }
public static bool operator !=(Point p1, Point p2)
{ return !p1.Equals(p2); }

vb.net:


كود :
Public Overloads Overrides Function Equals(ByVal o As Object) As Boolean
Return o.ToString() = Me.ToString()
End Function
Public Shared Operator =(ByVal p1 As Point, ByVal p2 As Point) As Boolean


Return p1.Equals(p2)
End Operator
Public Shared Operator <>(ByVal p1 As Point, ByVal p2 As Point) As Boolean

Return Not p1.Equals(p2)
End Operator
وهكذا تجد ان بامكانك عمل overloading لأي من هذه المعاملات :


والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم