在繼承機制中,程序員會遇到兩種截然不同的技術: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 對象時:
隱藏 (Shadowing) 如果基類方法在未考慮繼承的代碼中被依賴,則可能存在問題。它可能導致意外行為並使調試變得困難。另一方面,重寫 (Overriding) 提供了一種受控的機制來修改方法實現,同時保持繼承結構。
以上是C#繼承中的陰影和覆蓋有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!