Rumah > pembangunan bahagian belakang > C++ > Mengapa Memanggil `base.base.method()` Menghasilkan Keputusan yang Tidak Dijangka dalam Warisan C#, dan Bagaimana Ia Boleh Dielakkan?

Mengapa Memanggil `base.base.method()` Menghasilkan Keputusan yang Tidak Dijangka dalam Warisan C#, dan Bagaimana Ia Boleh Dielakkan?

Mary-Kate Olsen
Lepaskan: 2024-12-28 04:38:09
asal
626 orang telah melayarinya

Why Does Calling `base.base.method()` Produce Unexpected Results in C# Inheritance, and How Can It Be Avoided?

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.
Salin selepas log masuk

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.");
    }
}
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan