حاولت ان ابسط الشرح بقدر الامكان ليناسب المبتدئين في هذه الامور حيث ان الموضوع ليس سهلا على المبتدئين, و ليكون لدى المبتدئ تصور بسيط عن الموضوع على حسب ما استطعت (احيانا المقارنة و الترجمة تفقد المعنى المطلوب) و لكن لا مشكلة من تمهيد بسيط يصل لاغلب القارئين
في البداية بعض المعلومات البسيطة لتسهيل الشرح اكثر ما يمكن
Delegates (الوكلاء) نعم افضل تسمية في نظري هي وكيل؟؟
الوكيل يشبه الى حد بعيد المؤشر المستخدم في (C,C++).
مثال من الواقع
لو فرضنا ان لدينا شركة بالاسم (A) .
ولدى الشركة (A) بعض المنتجات (براد,مكيف,غسالة) وهذه الشركة لديها خدمة تسويق المنتجات عبر(مندوب ,وكيل) مهما كان الاسم.
نظريا هذا الوكيل لديه كل المعلومات عن المنتجات(الاسم,السعر,الموديل...الخ).
فانت عندما تتعامل مع الوكيل فانك ستملك كل المعلومات عن المنتجات التي توكل بها .
لو اردنا نحول هذا المثال الى واقع برمجي فأننا سنقول لدينا كلاس ما (مقر الشركة).
وهذا الكلاس فيه مجموعة من الدوال (ملفات تعريفية بالمنتجات في مقر الشركة).
و كل دالة من هذه الدوال تعطيننا معلومة محددة عن المنتج معلومات عن (السعر,الموديل,الكفالة...الخ) و ذلك بعد تمرير اسم المنتج للدالة .
اذا هذا يقودنا الى ان الوكيل قام باستدعاء الدوال عند سؤاله عن منتج ما (اذا هو لعب دور المؤشر على الدالة).
يثار هنا تساؤل لماذا كل هذا اللف و الدوران (لماذا لا استدعي الدالة بشكل مباشر و خلصنا)؟؟
اخي السائل هناك ما يعرف في الواقع البرمجي بنظام التغليف encapsulation الفائدة منه كبيرة (ليس الحديث للكلام عنه).
حيث نقوم بمثالنا السابق بتغليف كل الدوال السابقة (المعلومات عن المنتجات) مع وكيل واحد Delegate و بعدها يمكن للوكيل ان يجيب عن كل سؤال عند الطلب منه.
Delegate يقوم بهذه المهمة اذ انه يشير الى هذه الدالة (او مجموعة من الدوال)؟؟
نعم يستطيع التعامل مع مجموعة من الدوال نشرحه لاحقا.
هناك نوعين من الوكلاء (على حسب راي الشركة)
- Single-cast delegates .الاول يشير و يتكلف بدالة واحدة (مندوب عن البرادات)
- Multi-cast delegates يشير و يتكلف باكثر من دالة .
هيكلية الوكيل delegates (يذكرني بمندوب المبيعات) يجب ان تتوفر به شروط ليصبح وكيل
- اسم الوكيل ( تخيل وكيل بدون اسم؟).
- نوع المدخلات التي يقبلها الوكيل (البارمترات).
- نوع المخرجات التي يعيدها الوكيل (اذ انه سيتكفل بدوال تعيد مخرجات).
- الوكيل يعرف public .
انظر لهذا التعريف
كما ترى اسم الوكيل TestDelegate
معرف كـ Public
يقبل مدخلات من النوع String
يعيد النوع Void
و انظر الى الكلمة Delegate و هي ما تميزه على انه نائب عن الدالة التي تقبل المدخلات من النوع String
يتوجب عليك دائما تمهيد الوكيل قبل استخدامه انظر لذلك
التطبيق العملي:
سنعرض مثال بالكود و بعده الشرح
اولا عرفنا الوكيل TestDelegate
ثم الدالة Display التي سينوب عنها الوكيل (سيشير لها,يتكفل بها...الخ) تاخذ بارميتر نصي
في جزء التنفيذ مهدنا للوكيل و ارسلنا معه الدالة
طلبنا من المستخدم ان يكتب النص الذي يريد
و اخيرا جواب الوكيل (استدعاء الدالة من النائب عنها,الذي توكل بها).
في تشبيهنا الواقعي السابق سيكون على الوكيل ان يستقبل السؤال من الزبون كان يقول له براد مثلا, بعدها يقوم الوكيل باستدعاء محتويات الدالة الخاصة بالبراد و ماتحتويه و يعيد له المعلومات اللازمة .
ماذا لو احببت ان استخدم الوكيل ليكون نائبا عن اكثر من دالة ,نعم يمكنني ذلك و بكل بساطة انظر للمثال التالي:
الامور واضحة اليس كذلك.
يتبع...
في البداية بعض المعلومات البسيطة لتسهيل الشرح اكثر ما يمكن
Delegates (الوكلاء) نعم افضل تسمية في نظري هي وكيل؟؟
الوكيل يشبه الى حد بعيد المؤشر المستخدم في (C,C++).
مثال من الواقع
لو فرضنا ان لدينا شركة بالاسم (A) .
ولدى الشركة (A) بعض المنتجات (براد,مكيف,غسالة) وهذه الشركة لديها خدمة تسويق المنتجات عبر(مندوب ,وكيل) مهما كان الاسم.
نظريا هذا الوكيل لديه كل المعلومات عن المنتجات(الاسم,السعر,الموديل...الخ).
فانت عندما تتعامل مع الوكيل فانك ستملك كل المعلومات عن المنتجات التي توكل بها .
لو اردنا نحول هذا المثال الى واقع برمجي فأننا سنقول لدينا كلاس ما (مقر الشركة).
وهذا الكلاس فيه مجموعة من الدوال (ملفات تعريفية بالمنتجات في مقر الشركة).
و كل دالة من هذه الدوال تعطيننا معلومة محددة عن المنتج معلومات عن (السعر,الموديل,الكفالة...الخ) و ذلك بعد تمرير اسم المنتج للدالة .
اذا هذا يقودنا الى ان الوكيل قام باستدعاء الدوال عند سؤاله عن منتج ما (اذا هو لعب دور المؤشر على الدالة).
يثار هنا تساؤل لماذا كل هذا اللف و الدوران (لماذا لا استدعي الدالة بشكل مباشر و خلصنا)؟؟
اخي السائل هناك ما يعرف في الواقع البرمجي بنظام التغليف encapsulation الفائدة منه كبيرة (ليس الحديث للكلام عنه).
حيث نقوم بمثالنا السابق بتغليف كل الدوال السابقة (المعلومات عن المنتجات) مع وكيل واحد Delegate و بعدها يمكن للوكيل ان يجيب عن كل سؤال عند الطلب منه.
Delegate يقوم بهذه المهمة اذ انه يشير الى هذه الدالة (او مجموعة من الدوال)؟؟
نعم يستطيع التعامل مع مجموعة من الدوال نشرحه لاحقا.
هناك نوعين من الوكلاء (على حسب راي الشركة)
- Single-cast delegates .الاول يشير و يتكلف بدالة واحدة (مندوب عن البرادات)
- Multi-cast delegates يشير و يتكلف باكثر من دالة .
هيكلية الوكيل delegates (يذكرني بمندوب المبيعات) يجب ان تتوفر به شروط ليصبح وكيل
- اسم الوكيل ( تخيل وكيل بدون اسم؟).
- نوع المدخلات التي يقبلها الوكيل (البارمترات).
- نوع المخرجات التي يعيدها الوكيل (اذ انه سيتكفل بدوال تعيد مخرجات).
- الوكيل يعرف public .
انظر لهذا التعريف
PHP كود :
public delegate void TestDelegate(string message);
كما ترى اسم الوكيل TestDelegate
معرف كـ Public
يقبل مدخلات من النوع String
يعيد النوع Void
و انظر الى الكلمة Delegate و هي ما تميزه على انه نائب عن الدالة التي تقبل المدخلات من النوع String
يتوجب عليك دائما تمهيد الوكيل قبل استخدامه انظر لذلك
PHP كود :
TestDelegate t = new TestDelegate(Display);
التطبيق العملي:
سنعرض مثال بالكود و بعده الشرح
PHP كود :
using System;
public delegate void TestDelegate(string message); //تعريف الوكيل
class Test
{
public static void Display(string message)
{
Console.WriteLine("The string entered is : " + message);
}
static void Main()
{
TestDelegate t = new TestDelegate(Display); //تمهيد الوكيل للاستخدام مع الدالة
Console.WriteLine("Please enter a string");
string message = Console.ReadLine();
t(message); //استخدام الوكيل
Console.ReadLine();
}
}
اولا عرفنا الوكيل TestDelegate
ثم الدالة Display التي سينوب عنها الوكيل (سيشير لها,يتكفل بها...الخ) تاخذ بارميتر نصي
في جزء التنفيذ مهدنا للوكيل و ارسلنا معه الدالة
طلبنا من المستخدم ان يكتب النص الذي يريد
و اخيرا جواب الوكيل (استدعاء الدالة من النائب عنها,الذي توكل بها).
في تشبيهنا الواقعي السابق سيكون على الوكيل ان يستقبل السؤال من الزبون كان يقول له براد مثلا, بعدها يقوم الوكيل باستدعاء محتويات الدالة الخاصة بالبراد و ماتحتويه و يعيد له المعلومات اللازمة .
ماذا لو احببت ان استخدم الوكيل ليكون نائبا عن اكثر من دالة ,نعم يمكنني ذلك و بكل بساطة انظر للمثال التالي:
PHP كود :
using System;
public delegate void TestDelegate();
class Test
{
public static void Display1()
{
Console.WriteLine("This is the first method");
}
public static void Display2()
{
Console.WriteLine("This is the second method");
}
static void Main()
{
TestDelegate t1 = new TestDelegate(Display1);
TestDelegate t2 = new TestDelegate(Display2);
t1 = t1 + t2; // استخدمنا عملية دمج
t1(); //الاستدعاء
Console.ReadLine();
}
}
الامور واضحة اليس كذلك.
يتبع...
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


