Memanggil base.base.method() Secara Luar Biasa
Apabila memperoleh kelas daripada struktur asas, kata kunci asas membenarkan akses kepada ahli yang ditakrifkan dalam kelas induk terdekat. Walau bagaimanapun, dalam situasi yang luar biasa, mungkin terdapat keperluan untuk menggunakan kaedah daripada kelas lebih jauh daripada hierarki warisan.
Pertimbangkan senario kod yang disediakan, di mana Derived menggantikan Say() kaedah Asas. Dalam SpecialDerived, penggantian seterusnya Say() memanggil base.Say(), berhasrat untuk melaksanakan Say() daripada Asas.
Dijangka vs. Gelagat Sebenar
Keluaran yang dijangkakan ialah:
Called from Special Derived. Called from Base.
Walau bagaimanapun, disebabkan oleh sifat mengatasi kaedah, output sebenar termasuk panggilan yang tidak dijangka kepada Sebut() daripada Diperoleh:
Called from Special Derived. Called from Derived. Called from Base.
Menangani Isu
Sejak penyeruan langsung base .base.method() tidak disokong, pendekatan alternatif diperlukan. Pelaksanaan dikemas kini yang disediakan dalam SpecialDerived menunjukkan perkara ini:
class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); CustomSay(); // Calls CustomSay() from Derived instead of Say() base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } }
Dengan mentakrifkan kaedah maya yang dilindungi tambahan, CustomSay(), Derived boleh mengendalikan tingkah laku yang diingini tanpa menjejaskan terbitan lain kelas.
Pendekatan Refleksi Alternatif
Dalam senario di mana pengubahsuaian struktur warisan tidak dapat dilaksanakan, pendekatan berasaskan refleksi boleh digunakan seperti yang ditunjukkan di bawah:
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(); } }
Pendekatan ini menggunakan refleksi untuk mendapatkan semula secara dinamik Kaedah Sebut() daripada Base dan laksanakannya secara langsung, memintas proses penyelesaian kaedah standard.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanggil Kaedah Kelas Asas Daripada Kelas Terbitan Yang Telah Mengatasinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!