首頁 >後端開發 >C++ >如何在C#中呼叫基類的基類方法?

如何在C#中呼叫基類的基類方法?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-29 15:22:14783瀏覽

How to Call a Base Class's Base Class Method in C#?

呼叫base.base.method():

在物件導向程式設計中,使用基底類別和衍生類別建立類別層次結構是常見的做法類。當重寫派生類別中的方法時,可以使用 base 呼叫基底類別實作。但是,在某些場景下,您可能會遇到想要存取基類的基類的情況。

考慮以下範例程式碼:

class Base
{
    public virtual void Say()
    {
        Console.WriteLine("Called from Base.");
    }
}

class Derived : Base
{
    public override void Say()
    {
        Console.WriteLine("Called from Derived.");
        base.Say();
    }
}

class SpecialDerived : Derived
{
    public override void Say()
    {
        Console.WriteLine("Called from Special Derived.");
        base.Say();
    }
}

當您呼叫sd. Say() 對於SpecialDerived 的實例,您預期會得到以下輸出:

Called from Special Derived.
Called from Derived.
Called from Base.

但是,您實際上get:

Called from Special Derived.
Called from Derived. /* this is not expected */
Called from Base.

對Derived.Say() 的意外呼叫是因為base 總是會引用層次結構中的直接基底類別。因此,SpecialDerived.Say() 在呼叫 Base.Say() 之前呼叫 Derived.Say()。

為了避免這種行為,不能直接使用 base.base.method()。相反,您可以使用以下方法:

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

透過引入中間方法 CustomSay(),您可以控制派生類別呼叫鏈中執行的內容。在這種情況下,SpecialDerived 重寫 CustomSay() 以提供自己的行為,有效地跳過 Derived.CustomSay()。

或者,您可以使用反射存取基類方法句柄並直接呼叫它,如下所示:

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