首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 繼承、覆寫、多型與隱藏:核心機制深度解析

     編輯:關於C#

繼承基礎

class Parent { public void Say() => Console.WriteLine("Parent"); }
class Child : Parent { } // 繼承

var c = new Child();
c.Say(); // "Parent" - 繼承基類方法
  • 單一繼承:類別只能繼承一個基類。
  • 繼承公共/受保護成員;私有成員不可見 (但存在於實例中)。
  • Object 是所有類別的終極基類。

覆寫

機制

  • 基類方法加 virtual 允許覆寫。
  • 衍生類用 override 提供新實作。
  • 執行時期根據實例實際型別決定呼叫哪個版本 (動態綁定/多型)。
class Parent { public virtual void Say() => Console.WriteLine("Parent"); }
class Child : Parent { public override void Say() => Console.WriteLine("Child"); }

Parent p = new Child();
p.Say(); // "Child" - 多型:實際型別 Child 決定呼叫

覆寫規則

  • 簽章必須完全相同 (名稱、參數、回傳型別、泛型參數)。
  • 存取層級不能縮小 (protected → public 可,public → private 不可)。
  • 不可移除 virtual (除非加 sealed override)。
  • 不可覆寫非虛擬/靜態/密封成員。

多型

「一個介面,多種實作」。基類參考指向衍生類實例,呼叫虛擬方法時執行衍生類實作。

class Animal { public virtual void Speak() => Console.WriteLine("..."); }
class Dog : Animal { public override void Speak() => Console.WriteLine("Woof"); }
class Cat : Animal { public override void Speak() => Console.WriteLine("Meow"); }

var animals = new Animal[] { new Dog(), new Cat() };
foreach (var a in animals) a.Speak(); // Woof / Meow

隱藏

非刻意隱藏 (編譯器警告 CS0108)

class Parent { public void M() {} }
class Child : Parent { public void M() {} } // 警告:隱藏繼承成員

Parent p = new Child(); p.M(); // Parent.M
Child c = new Child(); c.M();  // Child.M

刻意隱藏

class Child : Parent 
{ 
    public new void M() {} // 明確意圖,無警告
}

隱藏 vs 覆寫 核心差異

特性覆寫隱藏
關鍵字virtual / overridenew (可省略)
綁定時機執行期 (動態)編譯期 (靜態)
基類參考行為呼叫衍生類實作呼叫基類實作
多型支援是否
適用場景擴充/修改行為修正基類設計、非多型情境

進階:base 關鍵字

  • base.Method():在覆寫方法中呼叫基類實作。
  • base.Property:存取基類屬性實作。
  • 建構函式中 base(...):呼叫基類建構函式。

設計原則

  1. 里氏替換原則 (LSP):衍生類必須能無縫替換基類。覆寫不應破壞基類契約 (前置條件不強化、後置條件不弱化)。
  2. 優先組合大於繼承:行為復用優先考慮介面 + 組合/策略模式。
  3. 謹慎使用 virtual:預設非虛擬,明確需要擴充點時才開放。文件化覆寫契約。
  4. 避免深層繼承鏈:超過 3-4 層難以維護,扁平化設計優於深層階層。

總結

繼承提供「是一種」關係的程式碼復用;virtual/override 實現執行期多型;new 提供編譯期隱藏。理解靜態 vs 動態綁定的本質差異,是正確使用繼承、避免微妙 Bug 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved