Saya memiliki kelas dasar yang berisi acara-acara berikut:
public event EventHandler Loading;
public event EventHandler Finished;
Di kelas yang mewarisi dari kelas dasar ini saya mencoba mengangkat acara:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Saya menerima kesalahan berikut:
Acara 'BaseClass.Loading' hanya dapat muncul di sisi kiri + = atau - = (BaseClass ')
Saya berasumsi saya tidak dapat mengakses acara ini sama dengan anggota yang diwarisi lainnya?
c#
events
inheritance
Jagwar
sumber
sumber
Jawaban:
Yang harus Anda lakukan adalah ini:
Di kelas dasar Anda (tempat Anda telah mendeklarasikan acara), buat metode yang dilindungi yang dapat digunakan untuk meningkatkan peristiwa:
(Perhatikan bahwa Anda mungkin harus mengubah metode-metode itu, untuk memeriksa apakah Anda harus memohon eventhandler atau tidak).
Kemudian, di kelas yang mewarisi dari kelas dasar ini, Anda bisa memanggil metode OnFinished atau OnLoading untuk meningkatkan peristiwa:
sumber
Anda hanya bisa mengakses acara di kelas yang mendeklarasikan, karena .NET membuat variabel instance pribadi di belakang layar yang benar-benar menampung delegasi. Melakukan ini..
sebenarnya melakukan ini;
dan melakukan ini ...
sebenarnya ini ...
Jadi Anda dapat (jelas) hanya mengakses variabel instance delegasi pribadi dari dalam kelas yang mendeklarasikan.
Konvensi ini untuk menyediakan sesuatu seperti ini di kelas yang mendeklarasikan ..
Anda kemudian dapat menelepon
OnMyPropertyChanged(EventArgs.Empty)
dari mana saja di kelas itu atau di bawah pusaka warisan untuk meminta acara tersebut.sumber
Tepat. Merupakan kebiasaan untuk menyediakan fungsi yang dilindungi
OnXyz
atauRaiseXyz
untuk setiap acara di kelas dasar untuk memungkinkan peningkatan dari kelas yang diwarisi. Sebagai contoh:Dipanggil di kelas yang diwarisi:
sumber
Anda dapat mencoba cara ini, Ini berfungsi untuk saya:
sumber
bukan untuk membangkitkan kembali utas lama tetapi kalau-kalau ada yang melihat, apa yang saya lakukan adalah
Ini memungkinkan Anda mewarisi acara dalam kelas turunan sehingga Anda dapat menjalankannya tanpa harus membungkus metode sambil mempertahankan sintaks + =. Saya kira Anda masih bisa melakukannya dengan metode pembungkus jika Anda melakukannya
sumber