面向對象編程中,隱藏和重寫是影響代碼行為的關鍵概念。本文將探討C#類繼承體系中兩者間的差異。
假設我們有一個基類"A",包含兩個方法"Foo"和"Bar"。 "Foo"方法聲明為public,而"Bar"方法聲明為public virtual,允許派生類重寫其實現。現在,考慮一個從"A"繼承的派生類"B"。
在隱藏中,派生類"B"定義了一個名為"Foo"的方法,其名稱和參數列表與基類方法相同。然而,在這種情況下,類"B"中的方法實現並沒有重寫基類實現。它在類"B"中創建了一個新的獨立方法,從而隱藏了基類方法。
例如,在提供的代碼片段中:
<code class="language-c#">public new int Foo() { return 1;} //隐藏</code>
類"B"中方法聲明之前的"new"關鍵字表示隱藏,當通過"B"類型的對象訪問時,有效地隱藏了基類"Foo"方法。
另一方面,重寫發生在派生類聲明一個方法時,該方法與基類中的虛方法或抽象方法具有相同的名稱和簽名。在這種情況下,派生類的實現顯式地替換了基類的實現,並成為派生類實例的默認行為。
在給定的示例中:
<code class="language-c#">public override int Bar() {return 1;} //重写</code>
由於基類"A"中的"Bar"聲明為virtual,"override"關鍵字允許類"B"重寫其實現並提供自己的行為。
當將派生類實例強制轉換為基類引用時,隱藏可能會導致意外行為。在這種情況下,可能會調用基類中的隱藏方法,而不是派生類中的重寫方法,這可能會導致運行時錯誤。
然而,重寫遵循繼承層次結構,並確保派生類的實例繼承並調用在這些類中定義的適當方法實現,從而確保一致且預期的行為。
以上是C#中的陰影和覆蓋有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!