Rumah >pembangunan bahagian belakang >C++ >Mengapa Memanggil `base.base.method()` Menghasilkan Keputusan yang Tidak Dijangka dalam Warisan C#, dan Bagaimana Ia Boleh Dielakkan?
Memanggil base.base.method()
Dalam kod ini, kami mempunyai hierarki kelas di mana SpecialDerived mewarisi daripada Derived, yang seterusnya mewarisi dari Pangkalan. Setiap kelas mempunyai kaedah Say() yang ditindih yang mencetak mesej yang menunjukkan kelas mana ia dipanggil.
Apabila sd.Say() dipanggil dalam kaedah Main(), kami menjangkakan output berikut:
Called from Special Derived. Called from Derived. Called from Base.
Walau bagaimanapun, output sebenar termasuk panggilan yang tidak dijangka kepada Derived.Say().
Untuk mengelakkan perkara ini, kami boleh mengubah suai kelas SpecialDerived untuk menggunakan kaedah CustomSay() dan bukannya mengatasi Say(). Dengan cara ini, hanya kaedah CustomSay() dipanggil apabila sd.Say() dipanggil:
class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
Alternatif lain, dibincangkan dalam jawapan yang berasingan, adalah untuk mengakses kaedah Say() Base secara terus menggunakan refleksi:
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(); } }
Walaupun pendekatan ini secara teknikalnya mungkin, ia tidak disyorkan kerana ia dianggap sebagai amalan buruk.
Atas ialah kandungan terperinci Mengapa Memanggil `base.base.method()` Menghasilkan Keputusan yang Tidak Dijangka dalam Warisan C#, dan Bagaimana Ia Boleh Dielakkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!