منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : الدرس الثاني والثلاثون - ال Delegates
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
كاتب الموضوع : أحمد جمال

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

نواصل رحلتنا مع ال advanced .net programming ، موعدنا اليوم مع ال Delegates .

قبل ان نشرح تركيبها وكيفية التعامل معها ، سنقوم بشرح لماذا نقوم باستخدامها .

لنفترض عدة دوال تستقبل int وتعيد int ايضاً خاصة بعمليات التحويل ، وهي على الشكل التالي :
C#:

كود :
[FONT=Tahoma]public int ConvertEGToD(int EG)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]return EG * 5.45;[/FONT]
[FONT=Tahoma]}[/FONT]
[FONT=Tahoma]public int ConvertRSToD(int RS)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]return RS * 3.75;[/FONT]
[FONT=Tahoma]}[/FONT]

[FONT=Tahoma]public int ConvertEGToRS(int EG)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]return EG * 1.45;[/FONT]
[FONT=Tahoma]}[/FONT]
[FONT=Tahoma]public int ConvertDToRS(int D)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]return D * 3.75;[/FONT]
[FONT=Tahoma]}[/FONT]
[FONT=Tahoma]public int ConvertDToEG(int D)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]return D / 5.45;[/FONT]
[FONT=Tahoma]}[/FONT]

[FONT=Tahoma]public int ConvertRSToEG(int RS)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]return RS / 1.45;[/FONT]
[FONT=Tahoma]}[/FONT]
vb.net:

كود :
[FONT=Tahoma]Public Function ConvertEGToD(ByVal EG As Integer) As Integer [/FONT]
[FONT=Tahoma]Return EG * 5.45 [/FONT]
[FONT=Tahoma]End Function [/FONT]
[FONT=Tahoma]Public Function ConvertRSToD(ByVal RS As Integer) As Integer [/FONT]
[FONT=Tahoma]Return RS * 3.75 [/FONT]
[FONT=Tahoma]End Function [/FONT]

[FONT=Tahoma]Public Function ConvertEGToRS(ByVal EG As Integer) As Integer [/FONT]
[FONT=Tahoma]Return EG * 1.45 [/FONT]
[FONT=Tahoma]End Function [/FONT]
[FONT=Tahoma]Public Function ConvertDToRS(ByVal D As Integer) As Integer [/FONT]
[FONT=Tahoma]Return D * 3.75 [/FONT]
[FONT=Tahoma]End Function [/FONT]
[FONT=Tahoma]Public Function ConvertDToEG(ByVal D As Integer) As Integer [/FONT]
[FONT=Tahoma]Return D / 5.45 [/FONT]
[FONT=Tahoma]End Function [/FONT]

[FONT=Tahoma]Public Function ConvertRSToEG(ByVal RS As Integer) As Integer [/FONT]
[FONT=Tahoma]Return RS / 1.45 [/FONT]
[FONT=Tahoma]End Function [/FONT]
كما لاحظت فعلاً ، فهي عدة دوال تستخدم للتحويلات المختلفة بين ثلاث عملات ، الجنية المصري والريال السعودي والدولار الأمريكي .
طبعاً يمكننا عملهم في دالة واحدة وارسال متغير يمثل رقم التحويل ، لكننا لن نستطيع عمل ذلك مثلاً مع دوال اكبر ومختلفة ، لذا فهذا المثال للتوضيح .
الآن في برنامجنا سنقرأ البيانات من المستخدم ، ومن ثم نستخدم جملة شرط if او switch لتحديد اي دالة سنقوم بارسال البيانات إليها ، هذا مختصر للكود المكتوب :
C#:

كود :
if (Operation == 0)

كود :
[FONT=Tahoma] result = ConvertDToEG(userInput);[/FONT]
[FONT=Tahoma]else if(Operation == 1)[/FONT]
[FONT=Tahoma]result = ConvertRSToD(userInput);[/FONT]
vb.net:

كود :
If Operation = 0 Then

كود :
[FONT=Tahoma] result = ConvertDToEG(userInput) [/FONT]
[FONT=Tahoma]ElseIf Operation = 1 Then [/FONT]
[FONT=Tahoma]result = ConvertRSToD(userInput) [/FONT]
[FONT=Tahoma]End If [/FONT]
ولكن لنفترض اننا فقط الآن نود معرفة نوع العملية دون تنفيذها وعرضها للمستخدم حيث سننفذها لاحقاً ، هذا يعني اننا سنقوم بذات الاختبار مرتين ، مرة للعرض على المستخدم ومرة لتنفيذ العملية ، ايضاً ألا تتفق معي في انك قد تحتاج لتنفيذ العملية مرتين في مكانين مختلفين ، وما دمت لا تحتفظ سوى برقم ال Operation إذا ستضطر لعمل جمل الشرط مرة أخرى .

من أجل هذا وجدت ال Delegates ، وهي ما سنتعرف عليها في الجزء القادم من هذا الدرس .
Delegetes :

لو اردنا تعريف Delgates لمجموعة دوال ، اول ما نحتاج إليه ان تكون هذه الدوال من نفس عدد البارميترات . ايضاً لها نفس ال input وال output ، لذا سيكون ال Delegate الخاص بدوالنا بالشكل التالي :

C#:

كود :
public delegate int myDelegate(int value);


vb.net:

كود :
Public Delegate Function myDelegate(ByVal value As Integer) As Integer

والآن كل ما علي في جملي الشرطية ان احدد لهذا التفويض - إن صحت الترجمة - الدالة المسؤول عنها ، لذا ستكون شروطنا المختصرة بالشكل التالي :
C#:

كود :
if (Operation == 0)

كود :
[FONT=Tahoma] {[/FONT]
[FONT=Tahoma]myDelegate aDelegate = new myDelegate(ConvertDToEG);[/FONT]
[FONT=Tahoma]result = aDelegate(userInput);[/FONT]
[FONT=Tahoma]}[/FONT]
[FONT=Tahoma]else if (Operation == 1)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]myDelegate aDelegate = new myDelegate(ConvertRSToD);[/FONT]
[FONT=Tahoma]result = aDelegate(userInput);[/FONT]
[FONT=Tahoma]}[/FONT]
vb.net:


كود :
If Operation = 0 Then

كود :
[FONT=Tahoma] Dim aDelegate As New myDelegate(ConvertDToEG) [/FONT]
[FONT=Tahoma]result = aDelegate(userInput) [/FONT]
[FONT=Tahoma]ElseIf Operation = 1 Then [/FONT]
[FONT=Tahoma]Dim aDelegate As New myDelegate(ConvertRSToD) [/FONT]
[FONT=Tahoma]result = aDelegate(userInput) [/FONT]
[FONT=Tahoma]End If [/FONT]
ايضا بامكانك تأخير الشرط الأخير الذي يقوم بتنفيذ ال Delegate للنهاية ، او تكرار استخدامها مرة أخرى ، حيث ان ال aDelegate قد اصبحت تعرف اي دالة تختص بتنفيذ هذه العملية الآن .

لن اتوسع كثيراً في هذا العالم ، هناك الكثير من النقاط في ال Delegates ولكني تجاوزت بعضها لعدم الحاجة المتكررة إليها ، فيما تجاوزت نقاط أخرى لإني لم استطع فهمها بطريقة كاملة تجعلني استطيع شرحها .

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