Bagikan melalui


Delegasi Generik (Panduan Pemrograman C#)

Delegat dapat menentukan parameter jenisnya sendiri. Kode yang mereferensikan delegasi generik dapat menentukan argumen jenis untuk membuat jenis konstruksi tertutup, sama seperti saat membuat instans kelas generik atau memanggil metode generik, seperti yang ditunjukkan dalam contoh berikut:

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

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

C# versi 2.0 memiliki fitur baru yang disebut konversi grup metode, yang berlaku untuk jenis konkret serta delegasi generik, dan memungkinkan Anda menulis baris sebelumnya dengan sintaks yang disederhanakan ini:

Del<int> m2 = Notify;

Delegasi yang ditentukan dalam kelas generik dapat menggunakan parameter jenis kelas generik dengan cara yang sama seperti metode kelas.

class Stack<T>
{
    public delegate void StackDelegate(T[] items);
}

Kode yang merujuk ke delegat harus menentukan argumen tipe dari kelas yang memuatnya, sebagai berikut:

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

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

Delegasi generik sangat berguna dalam menentukan peristiwa berdasarkan pola desain umum karena argumen pengirim dapat diketik dengan kuat dan tidak lagi harus dilemparkan ke dan dari 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)
    {
        if (StackEvent is not null)
            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;
}

Lihat juga