首頁 > 後端開發 > C++ > C#繼承中的陰影和覆蓋有什麼區別?

C#繼承中的陰影和覆蓋有什麼區別?

Barbara Streisand
發布: 2025-01-28 14:11:39
原創
347 人瀏覽過

What's the Difference Between Shadowing and Overriding in C# Inheritance?

C# 繼承中的 Shadowing 與 Overriding 區別詳解

在繼承機制中,程序員會遇到兩種截然不同的技術:Shadowing(隱藏)和 Overriding(重寫)。理解這兩者之間的細微差別對於有效運用繼承至關重要。

重寫 (Overriding) 發生在子類聲明一個方法時,該方法與基類中定義的方法具有相同的名稱、返回類型和參數列表。重寫允許子類提供基類方法的自定義實現。當子類的對象調用重寫的方法時,將執行子類中的代碼,有效地覆蓋基類方法的行為。

相比之下,隱藏(Shadowing) 發生在子類聲明一個方法時,該方法與基類中的方法具有相同的名稱,但方法簽名(返回類型或參數列表)不同。隱藏在子類中創建了一個新方法,它替換了基類中具有相同名稱的方法。在子類的對像上調用隱藏的方法將執行子類中的代碼,有效地隱藏了基類方法。

考慮以下示例:

class A {
   public int Foo() { return 5; }
   public virtual int Bar() { return 5; }
}
class B : A {
   public new int Foo() { return 1; }     // 隐藏
   public override int Bar() { return 1; } // 重写
}
登入後複製

當在 A 類和 B 類的對像上調用方法時,預期的輸出如下:

A clA = new A();
B clB = new B();

Console.WriteLine(clA.Foo()); // 输出:5
Console.WriteLine(clA.Bar()); // 输出:5
Console.WriteLine(clB.Foo()); // 输出:1
Console.WriteLine(clB.Bar()); // 输出:1

// 将 B 转换为 A
Console.WriteLine(((A)clB).Foo()); // 输出:5
登入後複製

關鍵區別在於將 B 對象轉換為 A 對象時:

  • 對於隱藏的方法 (Foo),調用基類的實現。
  • 對於重寫的方法 (Bar),調用子類的實現。

隱藏 (Shadowing) 如果基類方法在未考慮繼承的代碼中被依賴,則可能存在問題。它可能導致意外行為並使調試變得困難。另一方面,重寫 (Overriding) 提供了一種受控的機制來修改方法實現,同時保持繼承結構。

以上是C#繼承中的陰影和覆蓋有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板