首頁 >後端開發 >C++ >C# 重寫時如何防止中間類別方法呼叫?

C# 重寫時如何防止中間類別方法呼叫?

Patricia Arquette
Patricia Arquette原創
2024-12-26 20:51:10795瀏覽

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

如何在呼叫基本方法時避免中間覆蓋

在處理多個層級的類別層次結構時,可能會遇到您想要的情況從重寫方法呼叫基底方法,但您不想呼叫中間類別的實作。本文將探討如何在 C# 中實現此目的。

在提供的程式碼片段中,您有一個帶有虛擬方法 Say() 的基底類別。衍生類別重寫此方法,而 SpecialDerived 進一步重寫它。當為 SpecialDerived 的實例呼叫 sd.Say() 時,您會注意到不僅呼叫了您自己的實現,而且還呼叫了 Derived 的實作。

為了防止呼叫 Derived 的實現,您不能使用 base.base。說()。相反,您有兩個選擇:

選項1:將常用實作移至受保護的虛擬方法

如果您有應由多個衍生共享的常用實作類,將它們移到基類中受保護的虛擬方法。這允許其他類別僅重寫它們需要的實現,從而避免呼叫中間類別的實現。

例如,您可以引入受保護的虛擬方法 CustomSay(),而不是 Derived 重寫 Say():

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.");
    }
}

選項2:直接函數指標呼叫(不安全Approach)

作為替代方案,您可以使用不安全程式碼區塊直接呼叫基類方法的函數指標。不建議這種方法,因為它被認為是不安全的,並且可能導致潛在的錯誤。

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();            
    }
}

以上是C# 重寫時如何防止中間類別方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn