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
Mary-Kate Olsenasal
2024-12-28 04:38:09617semak imbas

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.

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!

Kenyataan:
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