منتدى رياض الجنة - Riad Al-Ganah

منتدى رياض الجنة - Riad Al-Ganah (https://montada.khaledbelal.com/index.php)
-   دورة .NET 2008 من منتدى فيجوال بيسك للعرب (https://montada.khaledbelal.com/forumdisplay.php?f=57)
-   -   الدرس الثاني والثلاثون : ال Delegates دورة .net 2008 (https://montada.khaledbelal.com/showthread.php?t=573)

khaledbelal 02-25-2010 02:37 PM

الدرس الثاني والثلاثون : ال Delegates دورة .net 2008
 
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

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

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

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

public int ConvertEGToD(int EG)
       {
           return 
EG 5.45;
       }
       public 
int ConvertRSToD(int RS)
       {
           return 
RS 3.75;
       }
 
       public 
int ConvertEGToRS(int EG)
       {
           return 
EG 1.45;
       }
       public 
int ConvertDToRS(int D)
       {
           return 
3.75;
       }
       public 
int ConvertDToEG(int D)
       {
           return 
5.45;
       }
 
       public 
int ConvertRSToEG(int RS)
       {
           return 
RS 1.45;
       } 

vb.net:
كود PHP:

Public Function ConvertEGToD(ByVal EG As Integer) As Integer 
   
Return EG 5.45 
End 
Function 
Public Function 
ConvertRSToD(ByVal RS As Integer) As Integer 
   
Return RS 3.75 
End 
Function 
 
Public Function 
ConvertEGToRS(ByVal EG As Integer) As Integer 
   
Return EG 1.45 
End 
Function 
Public Function 
ConvertDToRS(ByVal D As Integer) As Integer 
   
Return 3.75 
End 
Function 
Public Function 
ConvertDToEG(ByVal D As Integer) As Integer 
   
Return 5.45 
End 
Function 
 
Public Function 
ConvertRSToEG(ByVal RS As Integer) As Integer 
   
Return RS 1.45 
End 
Function 

كما لاحظت فعلاً ، فهي عدة دوال تستخدم للتحويلات المختلفة بين ثلاث عملات ، الجنية المصري والريال السعودي والدولار الأمريكي .
طبعاً يمكننا عملهم في دالة واحدة وارسال متغير يمثل رقم التحويل ، لكننا لن نستطيع عمل ذلك مثلاً مع دوال اكبر ومختلفة ، لذا فهذا المثال للتوضيح .
الآن في برنامجنا سنقرأ البيانات من المستخدم ، ومن ثم نستخدم جملة شرط if او switch لتحديد اي دالة سنقوم بارسال البيانات إليها ، هذا مختصر للكود المكتوب :
C#:
كود PHP:

            if (Operation == 0)

               
result ConvertDToEG(userInput);
           else if(
Operation == 1)
               
result ConvertRSToD(userInput); 

vb.net:
كود PHP:

If Operation 0 Then

   result 
ConvertDToEG(userInput
ElseIf 
Operation 1 Then 
   result 
ConvertRSToD(userInput
End If 

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

من أجل هذا وجدت ال Delegates ،

Delegetes :

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

C#:
كود PHP:

public delegate int myDelegate(int value); 

vb.net:
كود PHP:

Public Delegate Function myDelegate(ByVal value As Integer) As Integer 

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

if (Operation == 0)

          {
              
myDelegate aDelegate = new myDelegate(ConvertDToEG);
              
result aDelegate(userInput);
          }
          else if (
Operation == 1)
          {
              
myDelegate aDelegate = new myDelegate(ConvertRSToD);
              
result aDelegate(userInput);
          } 

vb.net:
كود PHP:

If Operation 0 Then

  Dim aDelegate 
As New myDelegate(ConvertDToEG
  
result aDelegate(userInput
ElseIf 
Operation 1 Then 
  Dim aDelegate 
As New myDelegate(ConvertRSToD
  
result aDelegate(userInput
End If 

ايضا بامكانك تأخير الشرط الأخير الذي يقوم بتنفيذ ال Delegate للنهاية ، او تكرار استخدامها مرة أخرى ، حيث ان ال aDelegate قد اصبحت تعرف اي دالة تختص بتنفيذ هذه العملية الآن .

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

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


الساعة الآن 02:54 PM.

Powered by vBulletin® v3.8.4, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. , TranZ By Almuhajir
النسخة الفضية

Ads Management Version 3.0.1 by Saeed Al-Atwi

a.d - i.s.s.w