Saya perlu memiliki beberapa delegasi di kelas saya.
Saya ingin menggunakan antarmuka untuk "mengingatkan" saya untuk mengatur delegasi ini.
Bagaimana caranya?
Kelas saya terlihat seperti ini:
public class ClsPictures : myInterface
{
// Implementing the IProcess interface
public event UpdateStatusEventHandler UpdateStatusText;
public delegate void UpdateStatusEventHandler(string Status);
public event StartedEventHandler Started;
public delegate void StartedEventHandler();
}
Saya membutuhkan antarmuka untuk memaksa delegasi tersebut:
public interface myInterface
{
// ?????
}
Sejak .NET 3.5 Anda juga dapat menggunakan delegasi System.Action, tanpa perlu mendeklarasikan tipe Anda sendiri.
Ini akan menghasilkan antarmuka berikut:
public interface myInterface { // Implementing the IProcess interface event Action<String> UpdateStatusText; event Action Started; }
sumber
Tunjukkan saja delegasi sebagai properti
public delegate void UpdateStatusEventHandler(string status); public delegate void StartedEventHandler(); public interface IMyInterface { UpdateStatusEventHandler StatusUpdated {get; set;} StartedEventHandler Started {get; set;} }
sumber
Jawaban Jon Skeet benar, saya hanya ingin menambahkan catatan.
Antarmuka tidak ada untuk "mengingatkan" apa yang harus Anda lakukan, atau apa yang harus dimasukkan ke dalam kelas Anda. Antarmuka adalah sarana abstraksi, digunakan dalam pemrograman Berorientasi Objek dan metode desain. Mungkin Anda tidak memerlukan deklarasi antarmuka sama sekali, kecuali Anda ingin melihat beberapa instance kelas yang konkret sebagai antarmuka di tempat lain dalam program Anda (Abstraksi).
Jika Anda ingin menerapkan beberapa standar pengkodean dalam proyek Anda, Anda mungkin ingin mencoba menggunakan alat analisis kode (seperti di Visual Studio) - Mereka mengizinkan ekstensi, yang dapat Anda gabungkan untuk menambahkan aturan analisis kode Anda sendiri.
Menggunakan analisis kode, jika Anda "lupa" untuk menambahkan delegasi (meskipun saya tidak melihat gunanya melupakannya, seolah-olah delegasi tidak digunakan, itu tidak diperlukan) Anda akan mendapatkan peringatan / kesalahan.
sumber
Salah satu komentar Anda mereferensikan jenis kembalian dari event handler. Apakah Anda lebih peduli dengan jenis penangan, atau data yang kembali dari acara? Jika yang terakhir, maka ini dapat membantu. Jika tidak, solusi ini tidak akan cukup, tetapi dapat membantu Anda lebih dekat dengan apa yang Anda cari.
Yang harus Anda lakukan adalah mendeklarasikan penangan peristiwa Anda sebagai penangan peristiwa umum di antarmuka dan implementasi Anda dan Anda bisa menyesuaikan hasil yang dikembalikan.
Kelas beton Anda akan terlihat seperti ini:
public class ClsPictures : myInterface { // Implementing the IProcess interface public event EventHandler<UpdateStatusEventArgs> UpdateStatusText; //no need for this anymore: public delegate void UpdateStatusEventHandler(string Status); public event EventHandler<StartedEventArgs> Started; //no need for this anymore: public delegate void StartedEventHandler(); }
Antarmuka Anda akan terlihat seperti ini:
public interface myInterface { event EventHandler<StartedEventArgs> Started; event EventHandler<UpdateStatusEventArgs> UpdateStatusText; }
Sekarang event args mengembalikan tipe Anda, Anda bisa mengaitkannya di setiap handler yang Anda tentukan.
Untuk referensi: https://msdn.microsoft.com/en-us/library/edzehd2t(v=vs.110).aspx
sumber
Antarmuka yang diwarisi dalam kelas turunan Anda akan mengingatkan Anda untuk mendefinisikan dan menghubungkan hal-hal yang Anda nyatakan di dalamnya.
Tetapi Anda mungkin juga ingin menggunakannya secara eksplisit dan Anda masih perlu mengaitkannya ke sebuah objek.
Misalnya menggunakan pola Inversi Kontrol:
class Form1 : Form, IForm { public Form1() { Controls.Add(new Foo(this)); } // Required to be defined here. void IForm.Button_OnClick(object sender, EventArgs e) { ... // Cast qualifier expression to 'IForm' assuming you added a property for StatusBar. //((IForm) this).StatusBar.Text = $"Button clicked: ({e.RowIndex}, {e.SubItem}, {e.Model})"; } }
Anda bisa mencoba sesuatu seperti ini.
interface IForm { void Button_OnClick(object sender, EventArgs e); } class Foo : UserControl { private Button btn = new Button(); public Foo(IForm ctx) { btn.Name = "MyButton"; btn.ButtonClick += ctx.Button_OnClick; Controls.Add(btn); } }
sumber