Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencegah Panggilan Kaedah Kelas Perantara Apabila Mengatasi dalam C#?

Bagaimana untuk Mencegah Panggilan Kaedah Kelas Perantara Apabila Mengatasi dalam C#?

Patricia Arquette
Lepaskan: 2024-12-26 20:51:10
asal
793 orang telah melayarinya

How to Prevent Intermediary Class Method Calls When Overriding in C#?

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

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

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!

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