Cara Mengelakkan Pembatalan Perantara semasa Memanggil Kaedah Asas
Apabila bekerja dengan pelbagai peringkat hierarki kelas, ada kemungkinan untuk menghadapi situasi yang anda inginkan untuk memanggil kaedah asas daripada kaedah mengatasi, tetapi anda tidak mahu menggunakan pelaksanaan kelas perantara. Artikel ini akan meneroka cara untuk mencapai ini dalam C#.
Dalam coretan kod yang disediakan, anda mempunyai kelas Asas dengan kaedah maya Say(). Kelas terbitan mengatasi kaedah ini, manakala SpecialDerived mengatasinya lagi. Apabila memanggil sd.Say() untuk contoh SpecialDerived, anda mendapati bukan sahaja pelaksanaan anda sendiri digunakan tetapi juga Derived.
Untuk mengelakkan pelaksanaan Derived daripada dipanggil, anda tidak boleh menggunakan base.base. Katakanlah(). Sebaliknya, anda mempunyai dua pilihan:
Pilihan 1: Alihkan Pelaksanaan Yang Biasa Digunakan kepada Kaedah Maya Dilindungi
Jika anda mempunyai pelaksanaan yang biasa digunakan yang sepatutnya dikongsi oleh berbilang terbitan kelas, alihkannya ke kaedah maya yang dilindungi dalam kelas asas. Ini membenarkan kelas lain untuk mengatasi hanya pelaksanaan yang mereka perlukan, mengelak daripada memanggil pelaksanaan kelas perantara.
Sebagai contoh, bukannya Derived overriding Say(), anda boleh memperkenalkan kaedah maya yang dilindungi CustomSay():
class Base { public virtual void Say() { Console.WriteLine("Called from Base."); } } class Derived : Base { public override void Say() { CustomSay(); base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } } class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
Pilihan 2: Seruan Penunjuk Fungsi Langsung (Tidak Selamat Pendekatan)
Sebagai alternatif, anda boleh menggunakan blok kod tidak selamat untuk terus menggunakan penunjuk fungsi untuk kaedah kelas asas. Pendekatan ini tidak disyorkan kerana ia dianggap tidak selamat dan boleh membawa kepada kemungkinan ralat.
class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer(); var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr); baseSay(); } }
Atas ialah kandungan terperinci Bagaimana untuk Mencegah Panggilan Kaedah Kelas Perantara Apabila Mengatasi dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!