深入理解方法宣告中「virtual override」與「new」關鍵字的差異
物件導向程式設計中,方法重寫允許子類別為其父類別中定義的方法提供自己的實作。這使得程式碼能夠實現客製化和多態性。然而,「virtual」和「override」關鍵字組合聲明基底類型中的方法,以及在子類型中使用「new」關鍵字,兩者之間存在細微差別。
「virtual override」
當基底類型中宣告的方法為「virtual」時,它表示其子類別可以重寫該方法。因此,當子類別使用“override”關鍵字重寫方法時,它實際上替換了基底類別中的實作。
「new」
相反,當子類別中宣告的方法為「new」時,它會建立一個與基底類別中方法同名的新方法。子類別方法不會重寫基底類別方法;它獨立運作。
行為差異
「virtual override」和「new」的主要差異在於它們對執行時間行為的影響。考慮以下範例:
<code class="language-csharp">public class BaseClass { public virtual bool DoSomething() { return false; } } public class DerivedClass : BaseClass { public override bool DoSomething() { return true; } } // ... BaseClass obj = new DerivedClass(); obj.DoSomething(); // 返回 true (重写后的实现)</code>
如果我們在DerivedClass
中使用“new”而不是“override”,則會導致一個不同的方法來隱藏基類方法。在這種情況下:
<code class="language-csharp">//... DerivedClass obj = new DerivedClass(); obj.DoSomething(); // 返回 false (基类实现)</code>
繼承與多態性
使用「virtual override」時,子類別方法可以存取和修改父類別提供的實作。這允許靈活的繼承和多態性。相反,“new”完全替換了基類方法,從而破壞了繼承鏈。
虛擬調度表 (VDT)
在 C# 中,虛擬方法儲存在虛擬調度表 (VDT) 中。呼叫虛擬方法時,根據運行時實際物件的類型確定合適的實作。這使得多態性成為可能。但是,「new」方法不包含在 VDT 中,從而阻止了動態方法選擇。
結論
「virtual override」允許重寫基底類別方法以實現繼承和多態性,而「new」則在子類別中建立獨立的方法。理解這兩個關鍵字之間的差異對於有效重寫方法和設計靈活的物件導向程式碼至關重要。
以上是C# 方法重寫中的「virtual override」和「new」關鍵字有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!