Bagikan melalui


Delegasi Generik (Panduan Pemrograman C#)

Delegasi dapat menentukan parameter jenisnya sendiri. Kode yang mereferensikan delegasi generik dapat menentukan argumen tipe untuk membuat tipe konstruksi tertutup, seperti saat membuat instance 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 delegasi konkret serta generik, dan Anda dapat menulis baris sebelumnya dengan sintaks yang disederhanakan ini:

Del<int> m2 = Notify;

Delegasi yang didefinisikan 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 mereferensikan delegasi 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 mendefinisikan acara berdasarkan pola desain tipikal 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