تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
The Delegation
#1
كاتب الموضوع : !!! BoriS !!!

التفويض البسيط Simple Delegate.

التفويض مشابة لمؤشرات الدوال Function pointers الموجودة فى ال c / c++ او العبارة Typedef التى تظهر عنوان الدالة او مؤشرها فى لغة c / c++ عنوان الدالة هو عنوانها فى الذاكرة Memory address – مؤشرات الدوال function pointers تملك او تحجز عنوان وحيد للدالة – هذا العنوان لا يستطيع حمل اى معلومات اضافية – على سبيل المثال عدد الوسيطات ال parameters الممررة للدالة.

فى الحقيقة – كل ما ذكر سابقا يجعل مؤشرات الدوال unsafe – عادة منادة الدالة من خلال عنوانها او مؤشراتها address يعتمد على اللغة هل هى تدعم مؤشرات الدوال function pointers. ام لا.

التفويض delegates يضيف الامان لمؤشرات الدوال التقليدية – ال .net frame work اضاف مزيد من التعزيز والقوة لكتابة تفويض امن باسم .delegate

مطورى دوت نت اعتمدوا ما يسمى Trust But Verify

مع امكانية التاكد الاتوماتيكى من الارشادات والتفاعلات التى تتم من خلال المترجم مع التفويض.

تزودك ال delegates فى vb.net بالاتى :

التعامل مع مؤشرات الدوال – الكتابة بامان .

باختصار : التفويض هو تركيب للبيانات يشير الى الطرق الديناميكية او الاستاتيكية Static Methods او الى نسخة الكائن Object Instance

داخل vb.net نقوم بالتصريح عن التفويض باستخدام Delegate.



كود :
[color=#000000][COLOR=#007700]Public [/color][color=#0000bb]Delegate Sub MyFirstDelegate[/color][color=#007700]([/color][color=#0000bb]ByVal MsgString [/color][color=#007700]As [/color][COLOR=#0000bb]String  
[/COLOR][/COLOR]

)


فى السطر السابق لما نصرح عن التفويض . بل قمنا بتعريفة فقط اى بواسطة الكود السابق لكى نخبر المترجم بانشاء فئة جديدة تسمى MyFirstDelegate مشتقة او موروثة من System.Delegate
المترجم يقوم بالاشتقاق بدلا منك فلاتقوم باشتقاق هذه الفئة .

ذه الطريقة مساوية لهذا الكود فى لغة c / c++

[php]typedef void (*MyFirstDelegate) (char *);[/PH]

التفويض هى التقنية الوحيدة القادرة على مناداة طريقة تحمل وسيطات نصية Strings ولاتعود بشئ اى تعود بــ Nothing.


عليك العلم ان التفويض هو عملية تغليف الدالة function مثلا داخل ال delegate (Encapsulation)

انظر المثال :

كود :
[color=#000000][COLOR=#007700]Public [/color][color=#0000bb]Sub one[/color][color=#007700]([/color][color=#0000bb]ByVal name [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
    [/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"one " [/color][color=#007700]+ [/color][color=#0000bb]name [/color][color=#007700]+ [/color][color=#dd0000]" !"[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End Sub

[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub Two [/color][color=#007700]([/color][color=#0000bb]ByVal Name [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
    [/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"Two " [/color][color=#007700]+ [/color][color=#0000bb]Name [/color][color=#007700]+ [/color][color=#dd0000]" !"[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End Sub  
[/COLOR][/COLOR]

الان داخل ال sub main تستطيع انشاء نسخة من التفويض ونستطيع ايضا تحديد مؤشر الدالة function pointer للتفويض بواسطة الكلمة Address Of.



كود :
[color=#000000][COLOR=#0000bb]Dim MyDelegate [/color][color=#007700]as [/color][COLOR=#0000bb]MyFirstDelegate
MyDelegate [/COLOR][color=#007700]= [/color][color=#0000bb]address of  One[/color][COLOR=#007700].  
[/COLOR][/COLOR]

الان قمنا بتحديد عنوان للتفويض ، نستطيع استخدام الطريقة Invoke لمنادة الدالة Function المغلفة فى التفويض اى Encapsulated Function.

كود :
[color=#000000][COLOR=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"Invoking Delegate..."[/color][COLOR=#007700])
[/COLOR][color=#0000bb]MyDelegate[/color][color=#007700].[/color][color=#0000bb]Invoke[/color][color=#007700]([/color][color=#dd0000]"Boris"[/color][COLOR=#007700])  
[/COLOR][/COLOR]

ونستطيع ان نجعل هذا التفويض يشير الى دالة اخرى.

كود :
[color=#000000][COLOR=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]MyDelegate [/color][color=#007700]= New [/color][color=#0000bb]MyfirstDelegate [/color][color=#007700]([/color][color=#0000bb]AddressOf Two[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"Invoking Delegate..."[/color][COLOR=#007700])
[/COLOR][color=#0000bb]MyDelegate[/color][color=#007700]([/color][color=#0000bb]Boris[/color][COLOR=#007700])  
[/COLOR][/COLOR]

Multicast Delegates

التفويض متعدد الاشكال ...

التفويض متعدد الاشكال هو التفويض القادر على مناداة اكثر من function فى نفس التفويض.
الفئة system.delgate تقوم بعملية تشغيل لل list المرتبطة بالتفويض والتى ستسخدم لتمسك بهذه الدوال لتقوم بتنفذها من خلال التفويض . هذه اللستة المرتبطة بالتفويض تسمى
Invocation List ، التفويض يزودك باعضاء مشتركة منها الطريقة Combine والتى تضيف ال Reference للدالة المحددة فى اللستة والتى تسمى Invocation List .



كود :
[color=#000000][COLOR=#007700]Public [/color][color=#0000bb]Delegate Sub MyDelegate[/color][color=#007700]([/color][color=#0000bb]ByVal MsgString [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])

Public [/COLOR][color=#0000bb]Sub One[/color][color=#007700]([/color][color=#0000bb]ByVal Name [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
    [/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"  One" [/color][color=#007700]+ [/color][color=#0000bb]Name [/color][color=#007700]+ [/color][color=#dd0000]" !"[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End Sub

[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub Two[/color][color=#007700]([/color][color=#0000bb]ByVal Name [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
    [/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"  Two " [/color][color=#007700]+ [/color][color=#0000bb]Name [/color][color=#007700]+ [/color][color=#dd0000]" !"[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End Sub

[/COLOR][color=#007700]Public [/color][color=#0000bb]Sub Two[/color][color=#007700]([/color][color=#0000bb]ByVal Name [/color][color=#007700]As [/color][color=#0000bb]String[/color][COLOR=#007700])
    [/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]" two " [/color][color=#007700]+ [/color][color=#0000bb]Name [/color][color=#007700]+ [/color][color=#dd0000]" !"[/color][COLOR=#007700])
[/COLOR][COLOR=#0000bb]End Sub

SUB MAIN
Dim One1 [/COLOR][color=#007700]As [/color][COLOR=#0000bb]MyDelegate
Dim Two2 [/COLOR][color=#007700]As [/color][COLOR=#0000bb]MyDelegate

One1 [/COLOR][color=#007700]= [/color][COLOR=#0000bb]AddressOf One
Two2 [/COLOR][color=#007700]= New [/color][color=#0000bb]MyDelegate[/color][color=#007700]([/color][color=#0000bb]AddressOf Two[/color][COLOR=#007700])  
[/COLOR][/COLOR]

لاظهار او لشرح التفويض متعدد الاشكال سوف ادمج التفويضان السابقان فى تفويض واحد باستخدام COMBINE


كود :
[color=#000000][COLOR=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"Adding One1 And" [/color][color=#007700]& [/color][COLOR=#0000bb]_
      
Dim OneTwo [/COLOR][color=#007700]As [/color][color=#0000bb]MyDelegate [/color][color=#007700]= [/color][COLOR=#0000bb]_
        [/COLOR][color=#007700][[/color][color=#0000bb]Delegate[/color][color=#007700]].[/color][color=#0000bb]Combine[/color][color=#007700]([/color][color=#0000bb]One1[/color][color=#007700], [/color][color=#0000bb]Two2[/color][COLOR=#007700])

[/COLOR][color=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"Adding Another" [/color][color=#007700]& [/color][COLOR=#0000bb]_  
  
OneTwo [/COLOR][color=#007700]= [[/color][color=#0000bb]Delegate[/color][color=#007700]].[/color][color=#0000bb]Combine[/color][color=#007700]([/color][color=#0000bb]OneTwo[/color][color=#007700], [/color][COLOR=#0000bb]_
    [/COLOR][color=#007700]New [/color][color=#0000bb]MyDelegate[/color][color=#007700]([/color][color=#0000bb]AddressOf Two[/color][COLOR=#007700]))  
[/COLOR][/COLOR]

بعد كتابة وتعريف التفويض ، اخبرنا المترجم بان ينشئ فئة جديدة تكون مشتقة او وارثة من الفئة
SYSTEM.DELEGATE


كود :
[color=#000000][COLOR=#0000bb]Dim Two  [/color][color=#007700]As [/color][color=#0000bb]MyDelegate [/color][color=#007700]=  [/color][COLOR=#0000bb]AddressOf Two  
[/COLOR][/COLOR]

الكودان مساويان لبعضهما ..


كود :
[color=#000000][COLOR=#0000bb]Dim Two  [/color][color=#007700]As [/color][COLOR=#0000bb]MyDelegate
Two  [/COLOR][color=#007700]= New [/color][color=#0000bb]MyDelegate[/color][color=#007700]([/color][color=#0000bb]AddressOf Two[/color][COLOR=#007700])  
[/COLOR][/COLOR]


باختصار..


كود :
[color=#000000][COLOR=#0000bb]OneTwo [/color][color=#007700]= [[/color][color=#0000bb]Delegate[/color][color=#007700]].[/color][color=#0000bb]Combine[/color][color=#007700]([/color][color=#0000bb]OneTwo[/color][color=#007700], [/color][COLOR=#0000bb]_
   [/COLOR][color=#007700]New [/color][color=#0000bb]MyDelegate[/color][color=#007700]([/color][color=#0000bb]AddressOf Two[/color][COLOR=#007700]))  
[/COLOR][/COLOR]

كمثال الدالة السابقة . لاضافة مرجع او مؤشر لدالة جديدة لكى توض الى Invocation List

ال Delegate Class يزود او يمد الدالة بالامكانيت الكافية لكى تحذف المؤشر الخاص بها او المؤشر الخاص بهــا من ال Delegate Invocation List.



كود :
[color=#000000][COLOR=#0000bb]Console[/color][color=#007700].[/color][color=#0000bb]WriteLine[/color][color=#007700]([/color][color=#dd0000]"Removing 'Two' ..."[/color][COLOR=#007700])
[/COLOR][color=#0000bb]OneTwo [/color][color=#007700]= [[/color][color=#0000bb]Delegate[/color][color=#007700]].[/color][color=#0000bb]Remove[/color][color=#007700]([/color][color=#0000bb]OneTwo[/color][color=#007700],[/color][color=#0000bb]two [/color][COLOR=#007700])  
[/COLOR][/COLOR]

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


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


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