Bagikan melalui


Menggunakan Variansi dalam Delegasi (C#)

Saat Anda menetapkan metode ke delegasi, kovarian dan kontravarian memberikan fleksibilitas untuk mencocokkan jenis delegasi dengan tanda tangan metode. Kovarian memungkinkan metode untuk memiliki jenis pengembalian yang lebih diturunkan daripada yang didefinisikan dalam delegasi. Kontravarian mengizinkan metode yang memiliki jenis parameter yang lebih sedikit diturunkan daripada yang ada di jenis delegasi.

Contoh 1: Kovarian

Deskripsi

Contoh ini menunjukkan bagaimana delegasi dapat digunakan dengan metode yang memiliki jenis pengembalian yang diturunkan dari jenis pengembalian dalam tanda tangan delegasi. Jenis data yang dikembalikan oleh DogsHandler adalah jenis Dogs, yang diturunkan dari jenis Mammals yang didefinisikan dalam delegasi.

Kode

class Mammals {}  
class Dogs : Mammals {}  
  
class Program  
{  
    // Define the delegate.  
    public delegate Mammals HandlerMethod();  
  
    public static Mammals MammalsHandler()  
    {  
        return null;  
    }  
  
    public static Dogs DogsHandler()  
    {  
        return null;  
    }  
  
    static void Test()  
    {  
        HandlerMethod handlerMammals = MammalsHandler;  
  
        // Covariance enables this assignment.  
        HandlerMethod handlerDogs = DogsHandler;  
    }  
}  

Contoh 2: Kontravarian

Deskripsi

Contoh ini menunjukkan bagaimana delegasi dapat digunakan dengan metode yang memiliki parameter yang jenisnya adalah jenis dasar dari jenis parameter tanda tangan delegasi. Dengan kontravarian, Anda dapat menggunakan satu penanganan aktivitas sebagai ganti penanganan terpisah. Contoh berikut menggunakan dua delegasi:

  • Delegasi KeyEventHandler yang menentukan tanda tangan peristiwa Button.KeyDown. Tanda tangannya adalah:

    public delegate void KeyEventHandler(object sender, KeyEventArgs e)
    
  • Delegasi MouseEventHandler yang menentukan tanda tangan peristiwa Button.MouseClick. Tanda tangannya adalah:

    public delegate void MouseEventHandler(object sender, MouseEventArgs e)
    

Contoh tersebut mendefinisikan penanganan aktivitas dengan parameter EventArgs serta menggunakannya untuk menangani peristiwa Button.KeyDown dan Button.MouseClick. Ini dapat melakukannya karena EventArgs adalah jenis dasar dari KeyEventArgs dan MouseEventArgs.

Kode

// Event handler that accepts a parameter of the EventArgs type.  
private void MultiHandler(object sender, System.EventArgs e)  
{  
    label1.Text = System.DateTime.Now.ToString();  
}  
  
public Form1()  
{  
    InitializeComponent();  
  
    // You can use a method that has an EventArgs parameter,  
    // although the event expects the KeyEventArgs parameter.  
    this.button1.KeyDown += this.MultiHandler;  
  
    // You can use the same method
    // for an event that expects the MouseEventArgs parameter.  
    this.button1.MouseClick += this.MultiHandler;  
  
}  

Lihat juga