التفويضات العامة (دليل البرمجة لـ #C)

يمكن للتفويض تعريف معلمات النوع الخاص به. التعليمات البرمجية التي تشير إلى التفويض العام يمكنها تحديد وسيطة النوع لإنشاء نوع مكون مغلق, مثلما يتم إنشاء مثل من فئة عامة أو استدعاء أسلوب عام, كما هو موضح في المثال التالي:

public delegate void Del<T>(T item);
public static void Notify(int i) { }

Del<int> m1 = new Del<int>(Notify);

لدى الإصدار 2.0 من #C ميزة جديدة تسمى تحويل مجموعة الأساليب وهي تنطبق على الأنواع الملموسة وأنواع التفويضات العامة وتمكنك من كتابة السطر السابق في بناء الجملة المبسط التالي:

Del<int> m2 = Notify;

يمكن للتفويضات المُعرّفه في الفئات العامة استخدام معلمات نوع الفئة العامة بنفس الطريقة التي تستخدمها أساليب الفئة.

class Stack<T>
{
    T[] items;
    int index;

    public delegate void StackDelegate(T[] items);
}

يجب على التعليمات البرمجية التي تشير إلى التفويض تحديد وسيطة النوع للفئة المحتوية، كما يلي:

private static void DoWork(float[] items) { }

public static void TestStack()
{
    Stack<float> s = new Stack<float>();
    Stack<float>.StackDelegate d = DoWork;
}

التفويضات العامة مفيدة بشكل خاص في تعريف الأحداث المبنية على نقش التصميم النموذجي لأن وسيطة المرسل يمكن أن تكون ذات نوع قوي ولا يجب تحويله (cast) من و إلى Object.

delegate void StackEventHandler<T, U>(T sender, U eventArgs);

class Stack<T>
{
    public class StackEventArgs : System.EventArgs { }
    public event StackEventHandler<Stack<T>, StackEventArgs> stackEvent;

    protected virtual void OnStackChanged(StackEventArgs a)
    {
        stackEvent(this, a);
    }
}

class SampleClass
{
    public void HandleStackChange<T>(Stack<T> stack, Stack<T>.StackEventArgs args) { }
}

public static void Test()
{
    Stack<double> s = new Stack<double>();
    SampleClass o = new SampleClass();
    s.stackEvent += o.HandleStackChange;
}

راجع أيضًا:

المرجع

مقدمة للأشياء العامة (دليل البرمجة لـ #C)

وظائف عامة (البرمجة C# إرشادات)

الفئات العامة ( ارشادات برمجة C#)

الواجهات العامة (دليل البرمجة لـ #C)

التفويضات (دليل البرمجة لـ #C)

System.Collections.Generic

المبادئ

دليل البرمجة لـ #C

موارد أخرى

generics في .NET Framework