المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس الثالث والأربعون : Operator Overloading دورة .net 2008


khaledbelal
02-26-2010, 04:22 PM
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

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

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

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

public struct Point
{
private int x, y;
public Point(int xPos, int yPos)
{
x = xPos;
y = yPos;
}
}


vb.net:

Public Structure Point
Private x As Integer, y As Integer
Public Sub New(ByVal xPos As Integer, ByVal yPos As
Integer)
x = xPos
y = yPos
End Sub
End Structure

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

C#:

public struct Point
{
private int x, y;
public Point(int xPos, int yPos)
{
x = xPos;
y = yPos;
}

public static Point operator + (Point p1, Point p2)
{ return new Point(p1.x + p2.x, p1.y + p2.y); }
public static Point operator - (Point p1, Point p2)
{ return new Point(p1.x - p2.x, p1.y - p2.y); }
}

vb.net:

Public Structure Point
Private x As Integer, y As Integer
Public Sub New(ByVal xPos As Integer, ByVal yPos As
Integer)
x = xPos
y = yPos
End Sub


Public Shared Operator +(ByVal p1 As Point, ByVal p2
As Point) As Point
Return New Point(p1.x + p2.x, p1.y + p2.y)
End Operator

Public Shared Operator -(ByVal p1 As Point, ByVal p2
As Point) As Point
Return New Point(p1.x - p2.x, p1.y - p2.y)
End Operator
End Structure



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

Point p3 = p1 + p2;

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

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

p2-=p1;

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

ليست معاملات الجمع والطرح فقط من يمكن عمل 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 لأي من هذه المعاملات :

http://vb4arab.com/vb/uploaded/3/01208733266.jpg

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